Должен ли новый всегда следовать за удалением?

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

int main()
{
     int* arr = new int[5];
     return 0;
}

Хотя для всех намерений и целей здесь не происходит утечки (поскольку ваша программа заканчивается, и ОС будет очищать всю память после ее возвращения), но стандарт все еще требует - или рекомендует - использование delete[] в этом случае? Если нет, была бы другая причина, по которой вы delete[] бы delete[] здесь?

Ответ 1

В стандарте нет ничего, что требовало бы delete[] - однако я бы сказал, что это очень хорошее руководство.

Однако лучше использовать delete или delete[] при каждой new или new[] операции new[], даже если память будет очищена после завершения программы.

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

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

Ответ 2

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

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

Ответ 3

Пожалуйста, смотрите:

Когда использовать "новый" а когда не на С++?

О конструкторах/деструкторах и операциях new/delete в С++ для пользовательских объектов

удалить и удалить [] то же самое в Visual С++?

Почему существует специальное новое и удаление для массивов?

Как отслеживать выделения памяти в С++ (особенно new/delete)

Массив структур и новый/удалить

В чем разница между новыми /delete и malloc/free?

Ответ 4

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

Ответ 5

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

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

Ответ 6

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