Ваш код вызывает неопределенное поведение . Неопределенное поведение означает, что все может произойти, поведение не может быть определено. Программа работает просто по счастливой случайности, ее поведение не может быть объяснено.
В основном
Если вы выделяете динамическую память с помощью new
, вы ДОЛЖНЫ использовать delete
для ее освобождения.
Если вы выделяете динамическую память с помощью new[]
, вы ДОЛЖНЫ использовать delete[]
для ее освобождения.
Передача любого адреса в delete
, который не был возвращен new
.
, является неопределенным поведением.
Вот цитата из Стандарта.
Согласно C ++ 03 Standard § 3.7.4.2-3:
Если функция освобождения завершается выдачей исключения, поведение не определено. Значение первого аргумента, переданного функции освобождения, может быть значением нулевого указателя; если так, и если функция освобождения предоставлена в стандартной библиотеке, вызов не имеет никакого эффекта. В противном случае предоставленное значение
для оператора delete(void*)
в стандартной библиотеке должно быть одно из значений, возвращаемых предыдущим вызовом оператора new(std::size_t)
или operator new(std::size_t, const std::nothrow_-t&)
в стандартной библиотеке, а значение, предоставляемое оператору delete[](void*)
в стандартной библиотеке, должно быть одно из значений, возвращаемых предыдущим вызовом operator new[](std::size_t)
или
operator new[](std::size_t, const std::nothrow_t&)
в стандартной библиотеке.
В C ++ лучше использовать RAII (SBRM) , используя Умные указатели вместо необработанных указателей, которые автоматически заботятся об освобождении памяти.