Подтвердить что ты не робот

Есть ли причина для вызова delete в С++, когда программа все равно выходит?

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

Да.

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

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