Должно ли за new всегда следовать delete?[дубликат]
-
23-08-2019 - |
Вопрос
Я думаю, мы все понимаем необходимость delete
при переназначении динамически выделяемого указателя, чтобы предотвратить утечки памяти.Однако мне любопытно, в какой степени C ++ предписывает использование delete
?Например, возьмем следующую программу
int main()
{
int* arr = new int[5];
return 0;
}
Хотя по сути здесь утечки не происходит (поскольку ваша программа завершается, и ОС очистит всю память после ее возвращения), но по-прежнему ли стандарт требует - или рекомендует - использование delete[]
в данном случае?Если нет, то была бы какая-то другая причина, по которой вы бы delete[]
здесь?
Решение
Нет ничего, что требовало бы delete[]
в стандарте - однако я бы сказал, что это очень хорошее руководство для подражания.
Тем не менее, лучше использовать delete
или delete[]
с каждым new
или new[]
операция, даже если память будет очищена при завершении программы.
Многие пользовательские объекты будут иметь деструктор, который выполняет другую логику, чем просто очистка памяти.Используя delete
гарантирует уничтожение в этих случаях.
Кроме того, если вы когда-нибудь измените свои процедуры, у вас будет меньше шансов вызвать утечки памяти в других местах вашего кода.
Другие советы
Обманутый из Есть ли причина вызывать delete в C ++, когда программа все равно завершается?
Ответ заключается в том, что из-за деструкторов, которые необходимо запустить, иногда необходимо удалить объект перед выходом из программы.Кроме того, многие инструменты обнаружения утечек памяти будут жаловаться, если вы этого не сделаете, поэтому, чтобы упростить поиск реальных утечек памяти, вам следует попробовать удалить все ваши объекты перед выходом.
Пожалуйста, посмотрите:
Когда использовать "new", а когда нет, в C ++?
О конструкторах / деструкторах и операторах создания / удаления в C ++ для пользовательских объектов
удалить и delete [] одно и то же в Visual C ++?
Почему существуют специальные new и delete для массивов?
Как отслеживать выделение памяти в C ++ (особенно для создания / удаления)
Здесь нет.Но по мере того, как программа становится все больше и сложнее, я бы управлял своей памятью, чтобы быстрее отслеживать ошибки.Стандарт ничего не говорит, но выработка хороших привычек в меньшем случае приводит к улучшению кода в долгосрочной перспективе.
Вы совершенно свободны забыть удалить что-либо.
Вам нравится тратить память впустую?
Я не знаю Стандарта, но вокруг этого вопроса существует целый стиль программирования: softxare только для сбоев Теоретически базы данных или ядра ОС должны разрабатываться как таковые, но часто использовать их таким образом не совсем практично, потому что при перезапуске происходит некоторая очистка, которая может занять много времени.Более того, зависимые системы (программы внутри операционной системы или клиенты базы данных) могут быть не только подвержены сбоям.