Есть ли причина вызывать delete в C ++, когда программа все равно завершается? - PullRequest
42 голосов
/ 24 марта 2009

В моей функции C ++ main, например, если бы у меня был указатель на переменную, которая использует кучу памяти (в отличие от стековой памяти) - это автоматически освобождается после выхода из моего приложения? Я бы предположил, что так.

Несмотря на это, является ли хорошей практикой всегда удалять выделения кучи, даже если вы думаете, что они никогда не будут использоваться в ситуации, когда память автоматически освобождается при выходе?

Например, есть ли смысл делать это?

int main(...)
{
    A* a = new A();
    a->DoSomething();
    delete a;
    return 0;
}

Я думал может быть в случае, если я произвожу рефакторинг (или кто-то другой рефакторинг) этот код и помещу его в другое место в приложении, где delete действительно необходим.

Помимо ответа Брайана Р. Бонди (который конкретно говорит о последствиях в C ++), у Пола Томблина также есть хороший ответ на специфический для C вопрос , в котором также говорится о деструкторе C ++. .

Ответы [ 8 ]

67 голосов
/ 24 марта 2009

Важно явно вызвать delete, потому что у вас может быть какой-то код в деструкторе, который вы хотите выполнить. Как, может быть, запись некоторых данных в файл журнала. Если вы позволите ОС освободить для вас память, ваш код в деструкторе не будет выполнен.

Большинство операционных систем освобождают память, когда ваша программа заканчивается. Но это хорошая практика, чтобы освободить его самостоятельно, и, как я уже сказал выше, ОС не будет вызывать ваш деструктор.

Что касается вызова удаления в целом, то да, вы всегда хотите вызвать удаление, иначе у вас будет утечка памяти в вашей программе, которая приведет к сбою новых выделений.

23 голосов
/ 24 марта 2009

Да, это помогает устранить ложные срабатывания, когда вы запускаете свою программу через инструмент обнаружения утечки памяти.

9 голосов
/ 14 мая 2011

Да.

  • Стандарт не гарантирует , что ОС очистит память. Вы можете ожидать этого на основных платформах, но зачем рисковать?
  • Вы сводите к минимуму беспорядок, о котором сообщают такие инструменты, как valgrind, если не намеренно теряете память.
  • Если вы попадаете в эту привычку, кто скажет, что вы однажды случайно не примените этот подход где-то, что имеет значение?
  • Вы можете нуждаться в уничтожении объекта. Обычно просто предполагают, что вы делаете. Тебе не больно.
7 голосов
/ 24 марта 2009

Рассмотрим случай, когда удаляемый объект получил внешний ресурс, который ОС не может безопасно освободить. Если вы не вызываете delete для этого объекта, у вас есть настоящая утечка.

6 голосов
/ 24 марта 2009

Подумайте о своем классе A, который должен уничтожить.
Если вы не позвоните delete на a, этот деструктор не будет вызван. Обычно это не имеет значения, если процесс все равно заканчивается. Но что, если деструктор должен выпустить, например, объекты в базе данных? Сбросить кеш в лог файл? Записать кэш памяти обратно на диск?

Видите ли, удаление объектов не просто "хорошая практика", в некоторых ситуациях это требуется.

3 голосов
/ 24 марта 2009

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

3 голосов
/ 24 марта 2009

Другая причина явного удаления объектов заключается в том, что если в вашем приложении есть реальная утечка памяти, становится проще использовать такие инструменты, как valgrind , чтобы найти утечки, если вам не нужно просеивать «утечки» из-за того, что не надо было убирать.

2 голосов
/ 24 марта 2009

всегда убедитесь, что вы удалите его самостоятельно. ОС позаботится об этом, но исключит ошибки, которых легко избежать

...