РЕДАКТИРОВАТЬ1: я знаю, что нет места размещения удалить. Но мне интересно, почему просто
удалить оператор не может удалить память, не заботясь о том, как это
память, на которую выделяются указатели?
Поскольку каждый вариант выделения памяти использует отслеживание памяти, зависящее от реализации (обычно блок заголовка, предшествующий адресу пользователя), и это заставляет выделение / освобождение работать только при правильном сопряжении:
new
должен соединиться с delete
new[]
должен соединяться с delete[]
(большинство реализаций, хотя простите смешивание new
и new[]
)
malloc
и жареные должны сочетаться с free
CoTaskMemAlloc
пары с CoTaskMemFree
alloca
пары ни с чем (разматывание стека об этом позаботится)
MyCustomAllocator
пар с MyCustomFree
Попытка вызвать неправильный деаллокатор приведет к непредсказуемому поведению (скорее всего, ошибка сегмента сейчас или позже). Следовательно, вызов delete
в памяти, выделенной чем-либо еще, кроме new
, приведет к плохим вещам.
Кроме того, новое размещение может быть вызвано на любой адрес, может даже не быть назначенным адресом. Он может быть вызван по адресу, расположенному в середине какого-то более крупного объекта, он может быть вызван в отображенной области памяти, он может быть вызван в необработанной виртуальной зафиксированной области, что угодно. delete
Во всех этих случаях попытка выполнить то, что говорит ему его реализация: вычесть размер заголовка, интерпретировать его как заголовок new
, связать его обратно в кучу. Kaboom.
Тот, кто знает, как освободить память нового адреса размещения, - это you , поскольку вы точно знаете, как эта память была выделена. delete
будет делать только то, что знает, и это может быть неправильно.