Что такое сборка мусора в C ++?

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

Немногим языкам нужны сборщики мусора как часть языка для обеспечения высокой эффективности. Эти языки называются языками для сбора мусора. Например, Java, C # и большинство языков сценариев нуждаются в сборке мусора как часть их функционирования. В то время как языки, такие как C и C ++, поддерживают ручное управление памятью, которое работает подобно сборщику мусора. Есть несколько языков, которые поддерживают как сборку мусора, так и ручное выделение / освобождение памяти, и в таких случаях отдельная куча памяти будет выделена сборщику мусора и ручной памяти.

Некоторые ошибки могут быть предотвращены при использовании метода сбора мусора. Такие как:

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

Давайте посмотрим на подробное понимание ручного управления памятью в сравнении с сборкой мусора, преимуществ, недостатков и того, как это реализовано в C ++.

Ручное управление памятью

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

В C ++ это выделение и освобождение памяти выполняется вручную с помощью таких команд, как new, delete. Использование «новой» памяти выделяется из кучи. После использования эта память должна быть очищена с помощью команды «delete».

Каждое выделение памяти с помощью 'new' должно завершаться командой 'delete'. Если нет, мы выйдем из памяти.

Чтобы показать это на примере:

n = новый образец_объекта;
******* здесь реализовано использование *******
удалить n;

Как показано, каждое новое должно заканчиваться или наклоняться с помощью команды удаления. Здесь указатель n выделяется из памяти с помощью команды 'new' и ссылается или указывает на объект с именем 'sample_object'. Как только использование и функционирование указателя завершено, мы должны освободить или освободить память, используя команду «delete», как было сделано выше.

Но в случае сборки мусора память выделяется с помощью команды «new», но ее не нужно освобождать вручную с помощью «delete». В таких случаях сборщик мусора периодически проверяет наличие свободной памяти. Когда часть памяти не указана никаким объектом, она очищает или освобождает память, создавая больше свободного пространства кучи.

Преимущества и недостатки ручного управления памятью

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

Также в случае ручного управления памятью деструктор будет вызываться в тот же момент, когда мы вызываем команду «удалить». Но в случае сборщика мусора это не реализовано.

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

Другая проблема, с которой мы сталкиваемся при ручном управлении памятью, заключается в том, что, если мы получим исключение во время выполнения или использования нового указателя, выделенного для памяти, он выйдет из последовательности 'new' и 'delete' и операция освобождения не будет выполнила. Также могут быть проблемы утечки памяти.

Преимущества и недостатки сборщика мусора

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

Алгоритм сбора мусора

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

Этот алгоритм может быть реализован в C ++ с использованием определенного типа указателя. Определенный тип указателя должен быть объявлен, и его можно использовать для таких целей, как отслеживание всех созданных ссылок, отслеживание количества ссылок при создании и удалении ссылки. Программа на C ++ может содержать как ручное управление памятью, так и сборку мусора, происходящую в одной программе. В соответствии с необходимостью можно использовать либо обычный указатель, либо указатель конкретного сборщика мусора.

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

Рекомендуемые статьи

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

  1. Конструктор и деструктор в Java
  2. Строковые функции C ++
  3. Деструктор на Яве
  4. Приложения C ++ в реальном мире
  5. Лучшие 11 функций и преимуществ C ++