С++ должен ли я пытаться удалить указатели на переменные жизненного цикла приложения?

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

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

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

Ответ 1

Нет, не пишите/отлаживайте/поддерживайте код, чтобы сделать что-то, что ОС уже очень хорошо.

Если нет конкретных причин для обратного (например, незавершенные транзакции, которые необходимо выполнить, файлы для очистки, соединения, которые нужно закрыть), я не хочу писать код, чтобы делать то, что ОС будет делать в любом случае. Если dtor ничего особенного не делает, зачем его называть?

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

Ответ 2

Технически, да, память исправлена. Но если вы не используете delete, деструкторы этих объектов не запускаются и их побочный эффект не применяется. Это может привести к тому, что временный файл не будет удален или изменение базы данных не будет выполнено в зависимости от того, что должны были сделать эти деструкторы.

И не забудь Мерфи. Теперь код для управления этими объектами используется, как вы описываете (объекты должны сохраняться на протяжении всей жизни программы), но позже вы захотите повторно использовать код, чтобы он запускался несколько раз. Если он не справится с воссозданием объектов должным образом, это будет протекать объекты.

Ответ 3

Всегда полезно очищать все, хотя память возвращена, эти объекты могут иметь другие выделенные ресурсы (разделяемая память, smeaphores и т.д.), которые необходимо очистить, возможно, деструкторами объектов.

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

Как вы тестируете свое приложение? Не очистка может препятствовать разработке достойного испытательного ремня. Тесты приложения могут потребовать способа подмены и перезагрузки.

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

Ответ 4

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

Ответ 5

Нет никакого правильного ответа. В большинстве случаев это, вероятно, не но есть деструкторы, которые делают что-то важное, помимо просто освобождая память (у меня есть тот, который удаляет временные файлы), который утверждает в пользу очистки; с другой стороны, разрушение таких объектов может привести к упорядочению проблем уничтожения, если объекты используются деструкторы других объектов. Мое общее правило - не разрушать, если деструктор не делает что-то большее, чем просто свободную память, но другие могут предпочесть другой набор значений по умолчанию.

Ответ 6

Помимо деструкторов, которые не выполняются (как sharptooth pointer out), также стоит удалить глобальные объекты, чтобы сделать шашки памяти счастливыми. Особенно, если ваш код находится в общей библиотеке - вы не хотите загромождать свою память (например, Valgrind) только потому, что вы не удалили должным образом.

Ответ 7

.. то есть те случаи, когда вы определенно не хотите, чтобы dtor вызывал вообще до того, как ОС завершит процесс, например:

1) Когда dtor не работает должным образом, потому что пытается прервать поток, сбой и блокировка на ручке потока или другом сигнале (многолетний "взаимоблокировка/ожидание" ), причиной является 99% всего домохозяйства "Мои приложения не будут закрывать чисто" сообщения.

2) Когда dtor не работает должным образом, потому что он просто плохой, и похоронен в библиотеке.

3) Если память должна пережить потоки процессов, тогда будут закрыты segfaults/AV (например, пулы буферов, которые потоки могут писать в ближайшее время).

4) Любые другие "особые случаи", в которых уничтожение объекта /s должно быть оставлено в ОС.

Есть так много "особых случаев", которые я считаю "очисткой" кода выключения как особый случай.