Может ли блок памяти, выделенный с помощью оператора new/malloc, сохраняться после завершения выполнения программы?

Возможный дубликат:
Когда вы выходите из приложения C, автоматически ли освобождается память malloc-ed?

Этот вопрос пришел мне на ум, когда я читал о том, как принудительно использовать delete/free соответственно, когда речь идет о распределении динамической памяти в C/С++. Я думал, что если выделение памяти сохраняется после завершения выполнения моей программы, тогда да, это обязательно; в противном случае, почему я должен беспокоиться о том, чтобы освободить выделенное пространство? Разве ОС не освобождает его автоматически с завершением процесса? Как я прав? Мой вопрос в том, что can

int *ip = new int(8);

сохраняется после завершения моей программы?

Ответ 1

Короткий ответ: Нет.

Длинный ответ: Нет. С++ никогда не будет сохраняться в памяти, если вы не сделаете работу, чтобы сделать это. Причиной свободной памяти является следующее:

Если вы не освободите память, а сохраните ее, вы в какой-то момент закончите. Как только вы закончите, почти все может случиться. В Linux, возможно, активист OOM активирован и ваш процесс убит. Возможно, ОС полностью загружается на диск. Возможно, вы придаете окну Windows синий экран, если вы используете достаточное количество памяти. Его можно почти мыслить как поведение undefined. Кроме того, если вы просачиваете память, он просто размещается там, неиспользуемый, неизданный, и никто не может использовать его, пока ваш процесс не завершится.

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

EDIT: стандарты C и С++ даже не дают гарантии, что память будет очищена ОС после завершения. Многие операционные системы и компиляторы могут, но нет никакой гарантии. Несмотря на это, все основные настольные и мобильные операционные системы (за исключением, вероятно, DOS и некоторых очень старых встроенных систем) очищают память процессов после него.

Ответ 2

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

С учетом сказанного, по-прежнему неплохо выпускать память: если ваша программа использует динамическую память, вам почти наверняка понадобится запустить профилировщик памяти, чтобы проверить утечку памяти. Профилировщик расскажет вам о блоках, которые вы не освободили в конце, и вам нужно будет их игнорировать. Гораздо лучше сохранить количество утечек на нуле, по той же причине, что хорошо устранить 100% ваших предупреждений компилятора.

Ответ 3

Любая хорошая ОС должна очищать все ресурсы, когда процесс завершается; принцип "всегда свободный, что вы выделили" хорош для двух вещей:

  • Если ваша программа утечки памяти, но никогда не выйдет (демоны, серверы,...), постоянно протекающая память будет плохо работать с RAM.

  • Вам не следует откладывать освобождение всей памяти до тех пор, пока ваша программа не завершится (например, Firefox иногда замечает, сколько времени требуется для ее выхода?) - точка заключается в том, чтобы минимизировать время, для которого вы выделили память; даже если ваша программа продолжает работать, вы должны немедленно освободить выделенную RAM после того, как вы ее закончите.

Ответ 4

1) Освободите свою память, когда вы запрашиваете ее, если она находится вне кучи. Утечка памяти никогда не бывает хорошей. Если это не повредит вам сейчас, это, вероятно, пойдет по дороге.

2) На C или С++ нет гарантии, что ваша ОС очистит память для вас. Возможно, вы когда-нибудь программируете на системе, которая на самом деле этого не делает. Или, что еще хуже, вы можете портировать код, в котором вас не волнует утечка памяти на эту новую платформу.

Ответ 5

Для исторической заметки: операционная система, используемая старыми компьютерами Amiga ( "AmigaOS" ), не имела полного управления памятью, как это принято сейчас (за исключением, возможно, для некоторых более поздних версий, выпущенных, когда Amiga больше не популярна).

У CPU не было MMU (блок управления памятью), и, как следствие, каждый процесс имел доступ ко всей физической памяти. Из-за этого, когда два процесса хотели поделиться некоторой информацией, они могли просто обменять указатели. Эта практика даже поощрялась ОС, которая использовала этот метод в своей схеме передачи сообщений.

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

Ответ 6

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

Ответ 7

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

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

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

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

Ответ 8

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

Ответ 9

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