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

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

Я могу'т знаю, как для других систем (хотя для меня это's разумно предположить, что они перенимают подобную практику), но, по крайней мере на Windows, ядро гарантированно очистки большинство ресурсов (за исключением нечетной несколько), используемые программы после окончания программы. Которая включает в себя память, среди разных других вещей.

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

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

Редактировать: Вопрос предложил в качестве дубликатов, характерные для семейства Unix операционных систем. Ее верхний ответ даже указан конкретный инструмент для Linux (например, отчет). Этот вопрос предназначен для покрытия самого "нормальный" и встраиваемых операционных систем и почему это или это't хорошая практика, чтобы освободить память, которая необходима на протяжении всей жизни программы.

Комментарии к вопросу (16)
Решение

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

Это не является обязательным, но он может иметь преимущества (как и недостатки).

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

Однако, освободив память, в конце исполнения явно,

  • во время отладки / тестирования, мэм средства обнаружения утечки выиграл'т показать вам, что "ложных срабатываний"и
  • это может быть гораздо проще, чтобы переместить код, который использует память совместно с выделение и освобождение в отдельный компонент и использовать его позже в другом контексте, где время использования памяти должны быть под контролем пользователя компонента

Продолжительность программы может меняться. Может быть, ваша программа сегодня небольшая утилита командной строки, с типичной продолжительностью жизни менее 10 минут, и он выделяет память в порции некоторых КБ каждые 10 секунд - не нужно так освобождает выделенную память до завершения программы. Позже программа изменяется и получает расширенное использование в рамках процесса сервера со сроком службы в несколько недель - значит, не освобождение неиспользуемой памяти между Это не вариант больше, в противном случае ваша программа начинается съедает всю доступную память сервера с течением времени. Это означает, что вам придется пересмотреть всю программу и добавить код после освобождения. Если Вам повезет, это непростая задача, если нет, это может быть так трудно, что высоки шансы, вы пропустили место. И когда вы находитесь в такой ситуации, вы бы добавили в "Свободе" код программы заранее, в то время, когда вы добавили в "аналог" и код.

В целом, написание выделения и обзоры, освобождая код всегда попарно считается, что "хорошим тоном" и среди многих программистов: делая это постоянно, вы уменьшаете вероятность забывания кода изъятия в ситуациях, когда память ** должны быть освобождены.

Комментарии (9)

Освобождение памяти по завершении выполнения программы-это просто пустая трата процессорного времени. Это's, как уборка дома, прежде чем уничтожить ее с орбиты.

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

Одно умное решение для этого есть "talloc-то", которая позволяет сделать нагрузка выделения памяти, а потом выкинуть их с одного звонка.

Комментарии (3)

Вы могли бы использовать язык с вывоз мусора (например, схема, данные, используемые, Хаскелл, общий Лисп, и даже Java, Скала, Clojure).

<суп>(в большинстве ГХ-Ed языки, там ни к явно и вручную свободной памяти! Иногда, некоторые значения могут быть завершен, например, ГК и [выполнения] системы3 закроет дескриптор файла значение, если это значение является недостижимым; но это не точно, ненадежный, и вы должны вместо того, чтобы закрыть явно ваш файл ручками, поскольку финализация не гарантирована) в</SUP-серфинг>

Вы также можете, за вашу программу, написанную на C (или даже c++) использовать Бем'ы консервативный сборщик мусора. Затем вы должны заменить все свои функция malloc с `GC_malloc и не заморачиваться по поводу "бесплатно" -Инг любой указатель. Конечно, вы должны понять плюсы и CONS-ячейки с помощью Бем'ы ГХ. Читайте также руководство ГК.

<суп>управление памятью является глобальным свойством программы. В некотором роде это (и живучестью ряда данных) является композиционным и не модульный, так как вся программа собственность.</SUP и ГТ;

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

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

Нет, вы не'т должны сделать это. И многих реальных программ Дон'т беспокоить освободив некоторый объем памяти, которая необходима на весь срок службы (в частности, ССЗ компилятор не освободив свою память). Однако, когда вы сделаете это (например, вы не'т беспокоить свободно-Инг иной кусок с динамически выделенной данные), вы'МР лучше комментарий том, чтобы облегчить работу будущих программистов на одном и том же проекте. Я, как правило, рекомендуют, что сумма неосвобожденная остается память ограничена, и, как правило, относительно небольшие Вт.Р.Т. в общей используемой памяти кучи.

Обратите внимание, что бесплатная система часто не освободить память для операционной системы (например, путем вызова выполнении munmap(2) в POSIX-системах), но обычно маркируют зоны памяти как многоразовый в будущем функция malloc. В частности, виртуальное адресное пространство (например, как видно через в/proc/самоуправления/карты на Linux, см. [учеб(5)][11]....) может не сокращаться после того, как "свободные" (отсюда и оборудованияПСилисверху` сообщили такое же количество используемой памяти для процесса).

Комментарии (3)

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

Один из самых мощных случаях я бегу в (снова и снова), что кто-то пишет небольшой кусочек моделирования код, который выполняется в их исполняемости. Они говорят, что "Мы'd, как этот код, чтобы быть включены в моделирование." Я тогда спросите их, как они планируют повторно инициализировать между Монте-Карло проходит, и они смотрят на меня непонимающе. "Что вы имеете в виду переинициализации? Вы просто запустите программу с новыми параметрами?&и"

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

Для примера о том, насколько странные вещи могут сделать, смотреть на то, как управляемые языки интернет с завершением в конце-процессов, или как в C# предложения с программным прекращение применения доменов. Они связать себя в узлы, потому что там'ы предположений, которые попадают через трещины в этих экстремальных случаях.

Комментарии (0)

Игнорируя языков, где вас Дон'т свободной памяти все равно вручную...

Что вы думаете о как "в программе" прямо сейчас, возможно, в какой-то момент становятся просто функция или метод, который является частью более крупной программы. А затем эта функция может вызываться несколько раз. И тогда память, что вы должны иметь и"освободил&я вручную; будет утечка памяти. Это, конечно, решение.

Комментарии (1)

Нет, это не обязательно, но это'хорошая идея.

Вы говорите, что вы чувствуете, что то"загадочные и страшные вещи будут происходить, если я не'т освободить память после того, как я'м сделано с помощью он&.ьquot;

С технической точки зрения, единственным последствием этого является то, что ваша программа будет продолжать есть больше памяти, пока либо жесткого лимита (например, виртуальное адресное пространство исчерпан), либо становится неприемлемым. Если программа собирается выйти, но это неважно, потому что этот процесс фактически перестает существовать. В "загадочные и страшные вещи" и чисто о разработчике'психические состояния s. Обнаружив источник утечки памяти может быть абсолютным кошмаром (это мягко сказано), и это занимает лот мастерства и дисциплины, чтобы писать код, без утечек. Рекомендуемый подход к развитию этого умения и дисциплина это всегда свободная память, когда он больше не нужен, даже если программа подходит к концу.

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

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

Рассмотрим случай, когда вы совершали миллионы мелких выделений, и они в основном были заменены на диск. Когда вы начинаете освобождая все большую часть вашей памяти должен попасть местами в оперативной памяти так, что учетная информация может быть доступна, только для того чтобы сразу отбросить данные. Это может сделать программа, потратьте несколько минут, чтобы покинуть! Не говоря уже положили много давления на диск и физической памяти за это время. Если физической памяти не хватает для начала (возможно, программа была закрыта, потому что другой программы жрут много памяти), то отдельные страницы, возможно, должны быть заменены несколько раз, когда несколько объектов должны быть освобождены от такой же страницы, но не освободил последовательно.

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

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

Комментарии (3)

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

Делать вещи, в то время как ваше понимание о них еще свежа.

Это's маленький инвестиция, которая может принести большую прибыль в будущем.

Комментарии (3)

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

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

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

Комментарии (0)