Возможные Дубликаты:
How does delete[] “know” the size of the operand array?
(POD)freeing memory : is delete[] equal to delete ?О удаления, удаления [], оператор удаления(), и т.д.
Как я понимаю, следующая
class A {};
A* a = new A;
//
delete A;
приведет к первому в вызове operator new()
(глобальный или специализированный, предоставленный A) для выделения нужного объема памяти, а затем для вызова конструктора A. И когда вызывается delete
, сначала вызывается деструктор A, а затем вызывается operator delete()
для освобождения «правильное количество памяти».
Как я прочитал в TC++ PL, это «нужное количество памяти» определяется так:
Чтобы освободить пространство, выделенное на новые, удалять и удалить [] должен быть в состоянии определить размер от выделенного объекта. Это означает, что объект, выделенный с использованием стандартной реализации new, займет немного больше места, чем статический объект. Как правило, для хранения размера объекта используется одно слово.
Это имеет смысл. Но где это слово хранится для доступа к delete
? Как раз перед адресом, указанным новым указателем? Так что delete
может получить размер, подлежащий удалению, путем доступа к a-sizeof<void*>
?
Можете ли вы прояснить это?
Я думаю, что ответ на этот вопрос может помочь мне понять, как работает delete []
. Я понимаю, как new []
будет работать, и что delete []
сначала вызывает деструкторы «все объекты массива» и Освобождает всю эту память ...
Но как delete []
может знать размер массива?
Спасибо за полезные ответы!
Я думаю, что это зависит от реализации, но более просвещенные люди, безусловно, будут более конкретными. – ereOn
Безрадочный дубликат, извините. –
связанный: [(POD) освобождение памяти: delete \ [\] равно удалению?] (Http://stackoverflow.com/questions/1553382/pod-freeing-memory-is-delete-equal-to-delete) – sbi