Что происходит с динамическим размещением объектов внутри объекта, который удаляется? - PullRequest
1 голос
/ 16 апреля 2011

Когда я использую ключевое слово delete для объекта, выполняется ли этот деструктор объектов? Что если удаленное возражение содержит другие указатели, а я их не удаляю, это утечка памяти?

Иногда я запутываюсь, когда использую delete. Проблема наихудшая для меня, когда я раздаю вещи. Я не знаю, когда безопасно использовать delete из-за боязни уничтожения объекта, на который указывает откуда-то еще.

Ответы [ 6 ]

3 голосов
/ 16 апреля 2011

Когда я использую ключевое слово delete для объекта, выполняется ли этот деструктор объектов?

Да. Для этого и нужен деструктор.

Что если удаленное возражение содержит другие указатели, а я их не удаляю, это утечка памяти?

Да. Это один из самых распространенных источников утечек памяти.

Я не знаю, когда безопасно использовать delete из-за боязни удалить объект, на который указывает откуда-то еще.

Это сложная проблема. Не существует системы, которая бы прекрасно ее решала, но вы можете продвинуться далеко вперед, используя умные указатели с подсчетом ссылок и уменьшив количество объектов, к которым предоставлен общий доступ.

1 голос
/ 16 апреля 2011

Когда я использую ключевое слово delete для объекта, выполняется ли деструктор объектов?

Да

Что если удаляемое возражение содержит другие указатели иЯ не удаляю их, это утечка памяти?

Да, если только у кого-то еще нет указателя и кто-то другой отвечает за их удаление.У вас также могут возникнуть проблемы из-за двойного удаления .Если вы удалите указатель, данный вам, но у кого-то еще есть указатель на эту память, то его указатель теперь ни на что не указывает.Когда он использует этот указатель, его программа может аварийно завершить работу.

Я не знаю, когда безопасно использовать delete из-за страха удалить объект, на который указывает указатель откуда-то еще.

Ты не единственный.Важно установить протоколы и соглашения между частями вашего кода о том, кто чем владеет.Что такое "производство" объектов.Что их "потребляет".Вы также можете использовать такие инструменты, как boost :: shared_ptr и boost :: weak_ptr для учета ссылок.

0 голосов
/ 29 августа 2011

Когда вы звоните delete someObect; ​​ происходит что-то вроде этого:

if(someObect != NULL)
{
someObect->~ClassName();// you did ClassName someObect = new ClassName(); 
operator delete(someObect);
}

И оператор delete делает, как я понимаю, то же самое, что free do - просто освобождает (освобождает) память.Но помните, что если вы использовали new , вы не можете использовать free , вы должны использовать delete и только его.

0 голосов
/ 16 апреля 2011

Да, это утечка. Посмотрите, может ли Freestore management FAQ дать вам понимание.

0 голосов
/ 16 апреля 2011

Если вы используете new, вы должны использовать delete.Это вызовет деструктор экземпляра для вызова.Если этот экземпляр new в каких-либо объектах своего конструктора (или более поздних) должен удалить их в своем деструкторе.

Кроме того, если вы создаете новые массивы up (new char [20] и т. Д.), Вы должны использовать 'delete [] 'при удалении, иначе поведение не определено.

Вы можете избежать многих проблем, используя std :: tr1 :: shared_ptr или boost :: shared_ptr, который будет выполнять подсчет ссылок и выполнять удалениедля вас это вместо:

Foo *pFoo = new Foo;

do

std::tr1::shared_ptr<Foo> pFoo(new Foo);

тогда вам не нужно делать удаление: когда счетчик общих ссылок shared_ptr обращается в ноль, он будет делатьудаление для вас.

0 голосов
/ 16 апреля 2011

Это утечка памяти. Это очень распространенная проблема. Когда вы удаляете объект, который вы использовали new для выделения памяти, он вызывает деструктор этих объектов. Деструктор - это то место, где вы должны предоставить реализацию для очистки (удаления) всей памяти, которую вы могли выделить за время существования этого объекта.

...