Если он работает в режиме релиза, это из-за удачи.
Майк Б прав, если предположит, что исправление отладки скрывает ошибку. В режиме освобождения используется указатель, который был освобожден, но не установлен в NULL
, и память, на которую он указывает, все еще «действительна». В какой-то момент в будущем распределение памяти изменится, или изменится образ памяти, или что-то заставит «действительный» блок памяти стать «недействительным». В этот момент ваша сборка релиза не будет работать. Переключение в режим отладки для поиска проблемы будет бесполезным, поскольку режим отладки был «исправлен».
Я думаю, что мы все согласны с тем, что следующий код не должен работать.
char * p = new char[16]; // 16 bytes of random trash
strcpy(p, "StackOverflow"); // 13 characters, a '\0' terminator, and two bytes of trash
delete [] p; // return 16 bytes to the heap, but nothing else changes;
if (p != NULL) // Why would p be NULL? It was never set to NULL
ASSERT(p[0] == 'S'); // In debug, this will crash, because p = 0xfeeefeee and
// dereferencing it will cause an error.
// Release mode may or may or may not work, depending on
// other memory operations
Как уже говорил любой другой автор, указатели должны быть установлены на NULL
после вызова delete
. Делаете ли вы это сами или используете boost, какую-то другую обертку или даже макрос в этой теме - решать только вам.