Как следует использовать стандарт C ++ - PullRequest
3 голосов
/ 01 сентября 2010

У меня есть этот классический вопрос о том, как следует использовать стандарт C ++ (я имею в виду фактический официальный документ окончательно оформленных документов), например C ++ 98, C ++ 03 используются для обучения и преподавания C ++. Моя идея только с точки зрения среднего пользователя C ++, а не с точки зрения юристов по языку или тех, кто хочет быть в комитете по стандартам, составителей компиляторов и т. Д.

Вот мои личные мысли:

a) Это прекрасное место для начала изучения C ++. Такие книги, как «С ++ в двух словах», «Язык программирования С ++» и т. Д., Отлично справляются с этой задачей, тесно сотрудничая со стандартом.

б) Возвращаться к Стандарту нужно только тогда, когда

  • компилятор дает поведение, которое не согласуется с тем, что говорят обычные книги или

  • определенное поведение несовместимо во всех компиляторах, например GCC, VS, Comeau и т. Д. Я понимаю тот факт, что эти компиляторы могут быть несовместимыми в очень редких случаях / темных углах языка, например шаблоны / обработка исключений и т. д. Однако действительно можно узнать о возможных различиях в поведении компилятора, только когда один из них переносит и / или мигрирует в другую среду или когда происходит обновление компилятора, например,

  • если концепция плохо объяснена / не объяснена в имеющихся книгах, например если это действительно продвинутая концепция

Есть мысли / идеи / рекомендации по этому поводу?

Ответы [ 4 ]

7 голосов
/ 01 сентября 2010

Стандарт языка C ++ был бы абсолютно ужасным местом для начала изучения языка. Он плотный, тупой и очень длинный. Часто информация, которую вы ищете, разбросана по семи различным предложениям или скрыта в половине предложения в предложении, совершенно не связанном с тем, где, по вашему мнению, это должно быть (или, что еще хуже, поведение указано в предложении, которое вы проигнорировали, поскольку Вы не думали, что это актуально ).

Конечно, у него есть свои применения. Чтобы назвать несколько,

  • Если вы считаете, что нашли ошибку в компиляторе, часто необходимо обратиться к стандарту, чтобы убедиться, что вы не просто неправильно понимаете, что такое указанное поведение.

  • Если вы обнаружите, что поведение между компиляторами несовместимо, удобно иметь возможность поиска правильного (или более правильного) поиска, хотя часто вам придется писать обходные пути независимо от этого.

  • Если вы хотите узнать , почему вещи такие, какие они есть, это часто хорошая справка: вы можете увидеть, как различные функции языка связаны, и понять, как они взаимодействуют. Конечно, не всегда все ясно, но часто так и есть. Есть много сжатых примеров и примечаний, демонстрирующих и объясняющих нормативный текст.

  • Если вы ссылаетесь на стандарт C ++ в посте о переполнении стека, вы получаете гораздо больше голосов . : -)

  • Очень интересно узнать о языке. Одно дело писать код и спотыкаться, заставляя вещи компилироваться и запускаться. И совсем другое - пойти и попытаться понять язык в целом и понять, почему нужно действовать определенным образом.

2 голосов
/ 01 сентября 2010

Стандарт должен использоваться для обеспечения переносимости кода.

При написании базового кода на C ++ вам не нужно ссылаться на стандарты, но при использовании шаблонов или расширенном использовании STL ссылка на стандарт необходима для обеспечения совместимости с более чем одним компилятором и последующейсовместимость с будущими версиями.

0 голосов
/ 01 декабря 2016
CPP coding guidelines
MEMORY MANAGEMENT

BUFFER OVERRUNS

STATIC BUFFER OVERRUNS

A static buffer overrun occurs when a buffer, which has been declared on the stack, is written to with more data than it was allocated to hold. The less apparent versions of this error occur when unverified user input data is copied directly to a static variable, causing potential stack corruption.

HEAP OVERRUNS

Heap overruns, like static buffer overruns, can lead to memory and stack corruption. Because heap overruns occur in heap memory rather than on the stack, some people consider them to be less able to cause serious problems; nevertheless, heap overruns require real programming care and are just as able to allow system risks as static buffer overruns.
Soulflower - Oil and Handmade Organic Soap
Perfect Remedy For All Skin & Hair Problems. Buy Now!

ARRAY INDEXING ERRORS

Array indexing errors also are a source of memory overruns. Careful bounds checking and index management will help prevent this type of memory overrun.
1. Use memcpy_s instead of memcpy
2. In memcpy_s destination size should be more than or equal to source size
3. If destination size is less than source size, relevant handling to be implemented. e.g.
a. creating fatal error log and throwing exception
b. copying truncated data

MEMORY LEAKS

It is the responsibility of each application to “free” dynamically requested memory when it is finished using it. When an application dynamically allocates memory, and does not free that memory when it is finished using it, that program has a memory leak.
1. Differentiate between delete of object and delete [] of array of objects.
Incorrect
char* myCharArray = new char[BUFF_SIZE];
delete myCharArray;
Correct
char* myCharArray = new char[BUFF_SIZE];
delete [] myCharArray;
2. While deleting check for NULL. If not NULL, delete and set to NULL
Correct
If(ptrData!= NULL)
{
delete ptrData;
ptrData=NULL;
}

3. Check size of STL container before iterating over its elements.

4. If STL containers contain pointers. Iterate over elements and delete each pointer individually. And clear container after this.
Incorrect

std::list<StructImageList*> listFinalImageIds //allocation and appending of pointers to list. ………

m_listFinalImageIds.clear();

Correct

std::list<StructImageList*> listFinalImageIds //allocation and appending of pointers to list. …… //clean up after list use is completed.

if(!m_listFinalImageIds.empty())

{ for(std::list<StructImageList*>::iterator it = m_listFinalImageIds.begin(); it != m_listFinalImageIds.end(); it++){ StructImageList* pData = *(it);

if(pData!= NULL) {

delete pData; pData = NULL;

}

}

m_listFinalImageIds.clear();
5. Use of BSTR. use smart pointer _bstr_t for handling of BSTRs.

https://msdn.microsoft.com/en-us/library/zthfhkd6.aspx


more at : 

http://www.writeulearn.com/cpp-coding-guidelines/

0 голосов
/ 01 сентября 2010

Я использую g++ для компиляции своих программ на C ++, и там я использую опцию -std=c++0x (ранее, -std=c++98), чтобы убедиться, что мой код всегда соответствует стандарту.Если я получаю какое-либо предупреждение или ошибку в отношении соответствия стандарту, я исследую это, чтобы обучиться и исправить свой код.

...