Не позволяйте людям говорить вам да. C ++ не имеет понятия о OS, так что сказать «да, операционная система очистит ее» больше не говорит о C ++, а о C ++, работающем в какой-то среде, которая может быть не вашей.
То есть, если вы динамически распределяете что-то, но никогда не освобождаете это, вы просочились. Он может закончить свой срок жизни только после того, как вы назовете delete
/ delete[]
. На некоторых ОС (и почти на всех настольных ОС) память будет восстановлена (поэтому другие программы могут ее использовать). Но память не такая же, как ресурс! ОС может освободить всю память, которую она хочет, если у вас есть какое-либо сокетное соединение для закрытия, какой-то файл для завершения записи и т. Д., ОС может этого не делать. Важно не допустить утечки ресурсов. Я слышал о некоторых встроенных платформах, которые даже не освобождают память, которую вы не освободили, что приводит к утечке до перезагрузки платформы.
Вместо того, чтобы динамически размещать объекты в необработанном виде (то есть вы должны явно удалить их), оберните их в автоматически распределенные (выделяемые стеком) контейнеры; невыполнение этого условия считается плохой практикой и делает ваш код очень грязным.
Так что не используйте new T[N]
, используйте std::vector<T> v(N);
. Последний не допустит утечку ресурсов. Не используйте new T;
, используйте smart_ptr p(new T);
. Умный указатель будет отслеживать объект и удалять его, когда он будет использоваться дольше. Это называется областным управлением ресурсами (SBRM, также называемое тупым именем Resource-Acquisition is Initialization или RAII.)
Обратите внимание, что нет единственного "smart_ptr
". Вы должны выбрать, какой из них лучше. Текущий стандарт включает std::auto_ptr
, но он довольно громоздкий. (Его нельзя использовать в стандартных контейнерах.) Лучше всего использовать часть умных указателей Boost или TR1, если ваш компилятор поддерживает это. Тогда вы получите shared_ptr
, возможно, самый полезный умный указатель, но есть много других.
Если каждый указатель на динамически выделенную память находится в объекте, который будет разрушаться (то есть не в другом объекте, который динамически выделяется), и этот объект знает, как освободить память, этот указатель гарантированно будет освобожден. Этот вопрос даже не должен быть проблемой, так как вы никогда не должны быть в состоянии просочиться.