2013-02-20 2 views
1

Что произойдет, если я выделил некоторую память во время выполнения, но никогда не вызывал delete, и программа завершается? Будет ли ОС освобождать всю память, которую я выделил, и никакая память не будет «потрачена впустую»? Или я потеряю часть памяти до перезагрузки компьютера?Что произойдет, если я не удалю?

Очевидно, что я знаю, что хорошая практика кодирования заключается в том, чтобы убедиться, что вы удалите то, что вам не нужно, поэтому я не просто спрашиваю «что такое точка delete»; Мне просто интересно узнать, что происходит внутри моей оперативной памяти.

+0

Чтобы освободить память, чтобы операционная система могла использовать ее снова. Когда ваша программа завершается, вся эта память будет автоматически освобождена, однако, стоит освободить, чтобы использование памяти в течение всего процесса вашего процесса оставило его низким (э-э) объемом памяти. – RageD

+0

Спасибо, что я так и думал. – user3728501

+2

один из вопросов, который вам нужно ... ЗАБУДЬТЕ ЭТО. Просто ... новый и удалить. всегда. всегда! ВСЕГДА! – gaussblurinc

ответ

4

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

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

С другой стороны, если мы напишем нашу программу почтового сервера, которая выделяет, скажем, 1 МБ буфера для чтения по электронной почте, обрабатывает его, и когда это будет сделано, память будет повторно использована для другого письма, тогда есть небольшая точка в освобождении этой памяти.

И если мы напишем программу, которая просто читает файл, загрузите весь файл в память и, когда он подсчитал все буквы в статистических целях, распечатает статистику и выходы, выделяет ли она много памяти или нет не имеет большого значения.

Конечно, все это предполагает, что вызов new является ПРОСТОЙ, чтобы выделить память. Если конструктор объекта делает что-то более сложное, например, открывать файл, приобретает замок или что-то еще, тогда всевозможные плохие вещи могут произойти довольно быстро, если деструктор не будет вызван.

ОС (для наиболее часто используемых ОС, таких как Linux, MacOS, iOS, другие Unix-системы, Windows, DOS, OS/2 и т. Д.) Освобождает память, используемую вашим приложением.

7

Концептуально, вы утечка памяти.

На практике,, хотя, если у вас есть нормальная ОС, он, скорее всего, очистится после вашего процесса. Но на самом деле не полагайтесь на это.

0

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

+2

Это относится только к операционным системам с менеджерами виртуальной памяти - основная часть существующих ОС - но, например, она не поддерживается для некоторых операционных систем реального времени. – Void