2009-06-14 2 views
5

Можно создать дубликат:
What REALLY happens when you don’t free after malloc?важность освобождения памяти?

Когда окончание программы в C/C++, вы должны очистить, освобождая указатели. Что произойдет, если вы не освободите память, например, если у вас есть указатель на int и не удаляет ее при завершении программы? Является ли память все еще используемой и может быть освобождена только при перезагрузке или автоматически освобождается, когда программа заканчивается? И в последнем случае, зачем его освобождать, если операционная система делает это за вас?

+1

Дубликат: http://stackoverflow.com/questions/654754/what-really-happens-when-you-dont-free-after-malloc –

+1

Дубликат этого тоже: http://stackoverflow.com/questions/ 347338/is-object-release-on-program-exit-really-needed/347349 – Tom

ответ

5

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

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

+1

Очень хорошо положить. Важность освобождения неиспользуемой памяти (и, конечно, реализация в путях, позволяющих освобождать ненужные выделения памяти) имеет решающее значение в длинных программах. Если вы пишете краткое домашнее задание на работу, важность имеет академический интерес. Однако, если вы пишете большое приложение (например, firefox - я знаю аргументы, не пламя, пожалуйста), и вы продолжаете выделять новые куски памяти и не освобождать старые неиспользуемые, у вас либо закончится нехватка памяти, либо ваше приложение будет быть сброшенными из-за слишком большого выделения ресурсов. – nik

7

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

+1

Это правильно. Чтобы ваша программа была масштабируемой, вы должны освободить все как можно раньше.Это случается на конец программы, но обычно нет. –

5

На настольной ОС, такой как Windows, Linux или MacOS, ваша память будет очищена для вас.

В некоторых операционных системах реального времени или встраиваемых операционных системах он не будет очищен для вас.

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

Вы также должны быть осторожны с рефакторингом - скажите, что вы начинаете писать функцию main(), которая выделяет некоторую память, и вы не утруждаете ее освобождением, потому что ОС сделает это за вас. Но тогда вы переводите этот код в функцию, которая называется много раз, в течение длительного периода времени - внезапно у вас происходит огромная утечка памяти.

1

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

Более проблематично: 1) если это происходит в цикле, в шагах вашей программы в размере и 2) на C++, если ваши «новые» ed-объекты не «удаляют» d, ваши деструкторы не запускаются , и это может привести к гораздо более серьезным проблемам (утечка мьютекса или утечка ресурсов, не очищенных ОС, проблемы с целостностью данных, список можно продолжить)

0

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

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