Тонкости и хитрости в вопросах и ответах
● continue не «обходит стороной» выражение шага, поэтому
for(int i = 0; i < 10; i++) ... continue; ...
не идентично
int i = 0; while(i < 10) ... continue; ... i++
Зачем нужен NULL?
Формально стандарты утверждают, что NULL идентичен 0 и для обоих гарантируется корректное преобразование к типу указателя.
Ho разница есть для случая функций с переменным числом аргументов (например, printf) — не зная типа параметров компилятор не может преобразовать 0 к типу указателя (а на писюках NULL может быть равным 0L).
С другой стороны, в нынешней редакции стандарта NULL не спасёт в случае полиморфности: когда параметр в одной функции int, а в другой указатель, при вызове и с 0, и с NULL будет вызвана первая.
Безопасно ли delete NULL? Можно ли применять delete[]var после new var[]? А что будет при delete data; delete data?
●delete NULL (как и free(NULL)) по стандарту безопасны;
●delete[] после new, как и delete после new[] по стандарту применять нельзя.
Если какие то реализации допускают это — это их проблемы;
●повторное применение delete к освобождённому (или просто не выделенному участку) обладает «неопределённым поведением» и может вызвать всё, что угодно — core dump, сообщение об ошибке, форматирование диска и прочее;
●последняя проблема может проявиться следующим образом:
new data1; delete data1; new data2;
delete data1; delete data2;
Что за чехарда с конструкторами? Деструкторы явно вызываются чаще...
На это существует неписанное «Правило Большой четвёрки»: если вы сами не озаботитесь о дефолтном конструкторе, конструкторе копирования, операторе