2009-04-04 3 views
8

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

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

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

ответ

10

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

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

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

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

0

Вы можете в любое время забыть удалить вещи.

Нравится ли вам тратить память?

1

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

+0

Действительно, я имею в виду, что я часто набираю инструкции delete [] прямо перед возвращением, хотя я знал (на практическом уровне), что это не имеет никакого значения. И это не привычка, я тоже хочу остановиться - мне просто было интересно, в какой степени стандарт рекомендовал ее. – GRB

0

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

7

контратип Is there a reason to call delete in C++ when a program is exiting anyway?

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

+0

Я пропустил это! :) –

+0

Да, на самом деле это было трудно найти; вы избили меня на почту, так как я нашел время, чтобы найти эту статью, поскольку я знал, что ее спрашивали в последние несколько дней. –

Смежные вопросы