Существует основное предположение на ваш вопрос:
Роль delete
и delete[]
является исключительно, чтобы освободить память.
... и ошибочный.
Для лучше или хуже, delete
и delete[]
играют двойную роль:
- Run деструкторов
- Свободная память (вызывая правильную перегрузку
operator delete
)
с исправленным предположение, мы можем теперь задать исправленный вопрос:
В чем заключается риск не звонить delete
/delete[]
, чтобы закончить время жизни динамически распределенных переменных?
Как уже упоминалось, очевидный риск - это утечка памяти (и, в конечном счете, сбой). Однако это наименьшее из ваших забот. Гораздо больше риск неопределенное поведение, что означает, что:
- компилятор может случайно не производить исполняемый код, который ведет себя, как и ожидалось: Мусор, мусор из.
- в прагматической точки зрения, то, скорее всего, выход в том, что деструкторы не работают ...
Последнее крайне тревожная:
- Мьютексы: Забудьте снять блокировку, и вы получите a deadlock ...
- Файловые дескрипторы: Некоторые платформы (например, FreeBSD, я считаю) имеют пресловутое ограничение по умолчанию для числа дескрипторов файлов, которые может открыть процесс; не удается закрыть дескрипторы файлов, и вы не сможете открыть какой-либо новый файл или сокет!
- Сокеты: помимо дескриптора файла существует ограниченный диапазон портов, связанных с IP (который с последней версией Linux больше не является глобальным, да!). Абсолютный максимум составляет 65 536 (u16 ...), но эфемерный диапазон портов обычно намного меньше (половина его). Если вы забываете своевременно выпускать соединения, вы можете легко оказаться в ситуации, когда даже если у вас много доступной полосы пропускания, ваш сервер перестает принимать новые соединения, потому что нет доступного эфемерного порта.
- ...
Проблема с отношением хорошо, я получил достаточно памяти в любом случае, что память, вероятно, наименьшее из забот просто потому, что памяти, вероятно, наименее дефицитным ресурсом вы манипулируют.
Конечно, вы могли бы сказать: Хорошо, я сосредоточусь на других ресурсах утечки, но инструменты в настоящее время сообщают о них, как утечка памяти (и это достаточно), чтобы изолировать эту утечку среди сотен/тысяч, как ищут иголку в стог сена ...
Примечание: я упомянул, что вы все еще можете не хватать памяти? Независимо от того, находятся ли на нижних машинах/системах или в ограниченной системе процессов/виртуальных машинах память может быть достаточно жесткой для этой задачи.
Примечание: если вы вызываете delete
, вы делаете это неправильно. Научитесь использовать стандартную библиотеку std::unique_ptr
и ее контейнеры std::vector
. В C++ автоматическое управление памятью легко, реальная задача состоит в том, чтобы избежать оборванных указателей ...
Утечка памяти постоянно и бесполезно потребляет системные ресурсы, которые являются конечными. Разве это не достаточная причина? – Nemo
Утечки памяти в худшем случае, когда они находятся в цикле. Подумайте о игре, которая повторяет цикл для каждого шага обновления и имеет утечку памяти в этом цикле. –
Вы будете работать на низкой памяти, но до этого ваша система будет замедляться из-за подкачки – marcinj