Должно ли за new всегда следовать delete?[дубликат]

StackOverflow https://stackoverflow.com/questions/716353

  •  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 ++, когда программа все равно завершается?

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

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

Вы совершенно свободны забыть удалить что-либо.

Вам нравится тратить память впустую?

Я не знаю Стандарта, но вокруг этого вопроса существует целый стиль программирования: softxare только для сбоев Теоретически базы данных или ядра ОС должны разрабатываться как таковые, но часто использовать их таким образом не совсем практично, потому что при перезапуске происходит некоторая очистка, которая может занять много времени.Более того, зависимые системы (программы внутри операционной системы или клиенты базы данных) могут быть не только подвержены сбоям.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top