У меня есть, class A
который использует выделение кучи памяти для одного из своих полей. Класс A создается и сохраняется как поле указателя в другом классе ( class B
.
Когда я закончу с объектом класса B, я вызываю delete
, который, я полагаю, вызывает деструктор ... Но вызывает ли это и деструктор класса A?
Редактировать:
Из ответов, я беру это (пожалуйста, измените, если неправильно):
delete
экземпляра B вызывает B :: ~ B ();- какие звонки
A::~A();
A::~A
должен явноdelete
все выделенные кучей переменные-члены объекта A;- Наконец, блок памяти, хранящий указанный экземпляр класса B, возвращается в кучу - когда использовался new , он сначала выделял блок памяти в куче, затем вызывал конструкторы для его инициализации, теперь после того, как все деструкторы были вызваны для завершения объекта, блок, в котором находился объект, возвращается в кучу.
источник
++
оператор на нем. Поэтому мне интересно, если указатель, который указывает на середину данных класса, все еще имеет эффект.Когда вы вызываете delete для указателя, выделенного новым, будет вызван деструктор указанного объекта.
источник
Он называется «деструктор», а не «деконструктор».
Внутри деструктора каждого класса вы должны удалить все остальные переменные-члены, которые были назначены с новым.
редактировать: уточнить:
Скажи, что у тебя есть
Выделение экземпляра B с последующим удалением является чистым, потому что то, что B выделяет внутри, также будет удалено в деструкторе.
Но экземпляры класса C будут пропускать память, поскольку он выделяет экземпляр A, который он не освобождает (в этом случае C даже не имеет деструктора).
источник
Если у вас есть обычный указатель (
A*
), то деструктор не будет вызван (и,A
например, память не будет освобождена), если выdelete
явно не сделаете это вB
деструкторе. Если вы хотите автоматическое уничтожение, посмотрите на умные указатели, какauto_ptr
.источник
Вы должны удалить A самостоятельно в деструкторе B.
источник
Когда вы делаете:
Деструктор будет вызываться только в том случае, если в вашем базовом классе есть ключевое слово virtual.
Тогда, если у вас нет виртуального деструктора, вызывается только ~ B (). Но поскольку у вас есть виртуальный деструктор, сначала вызывается ~ D (), а затем ~ B ().
Никто из членов B или D, выделенных в куче, не будет освобожден, если вы явно не удалите их. И удаление их также вызовет их деструктор.
источник
У вас есть что-то вроде
Если вы затем позвоните
delete b;
, ничего не случится, и у вас утечка памяти. Попытка вспомнитьdelete b->a;
не является хорошим решением, но есть несколько других.Это деструктор для B, который удалит a. (Если a равно 0, это удаление ничего не делает. Если a не равно 0, но не указывает на память из нового, вы получаете повреждение кучи.)
Таким образом, у вас нет указателя в качестве указателя, а скорее auto_ptr <> (также будет работать shared_ptr <> или другие умные указатели), и он автоматически удаляется, если b.
Любой из этих способов работает хорошо, и я использовал оба.
источник
Мне было интересно, почему деструктор моего класса не был назван. Причина в том, что я забыл включить определение этого класса (#include "class.h"). У меня было только объявление типа «класс А»; и компилятор был доволен этим и позволил мне назвать «удалить».
источник
Указатель будет удален. Вы должны вызвать delete на A явным образом в деструкторе B.
источник
Деструктор для объекта класса A будет вызываться только в том случае, если для этого объекта вызывается delete. Обязательно удалите этот указатель в деструкторе класса B.
Для получения дополнительной информации о том, что происходит, когда удаление вызывается для объекта, см .: http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.9.
источник
нет, он не вызовет деструктор для класса A, вы должны вызывать его явно (как сказал PoweRoy), удалить строку 'delete ptr;' в пример для сравнения ...
источник