Що таке збір сміття C ++?

Збір сміття - це техніка управління пам’яттю. Це окремий метод автоматичного управління пам’яттю, який використовується в мовах програмування, де ручне управління пам’яттю не є бажаним або виконаним. У ручному способі управління пам'яттю користувачеві потрібно згадати пам'ять, яка використовується, і яка може бути розміщена, тоді як сміттєзбірник збирає пам'ять, яку займають змінні або об'єкти, які більше не використовуються в програмі. Збиральниками сміття керуватимуть лише пам'яттю, інші ресурси, такі як деструктори, вікно взаємодії з користувачем або файли, збирач сміття не оброблятиметься.

Небагато мов потребують збирачів сміття як частини мови для гарної ефективності. Ці мови називаються зібраними сміттям. Наприклад, Java, C # та більшість мов сценаріїв потребують збирання сміття в рамках їх функціонування. Тоді як такі мови, як C і C ++, підтримують керування пам'яттю вручну, яка працює аналогічно сміттєзбірнику. Є кілька мов, які підтримують як збирання сміття, так і вручну керування розподілом пам’яті / розсилкою пам’яті, і в таких випадках для збирача сміття та пам’яті вручну буде виділена окрема купа пам’яті.

Деякі помилки можна запобігти, коли використовується метод збору сміття. Як от:

  • проблема звисаючого вказівника, у якій вказівка ​​пам’яті вже розміщена, тоді як покажчик все ще залишається і вказує на різні переділені дані або вже видалену пам’ять
  • проблема, яка виникає, коли ми вдруге намагаємось видалити або розібрати пам'ять, яка вже була видалена або перенесена на інший об'єкт
  • видаляє проблеми або помилки, пов’язані зі структурою даних, та робить оперативні пам'ять та обробку даних
  • можна уникнути витоку пам'яті або проблеми з виснаженням пам'яті

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

Ручне управління пам’яттю

Динамічно розподілену пам'ять під час роботи з купи потрібно звільнити, як тільки ми припинимо її використання. Динамічно розподілена пам'ять забирає пам'ять з купи, яка є вільним сховищем пам'яті.

У C ++ це розподіл пам'яті та розподіл пам'яті здійснюються вручну, використовуючи команди, такі як new, delete. Використання 'нової' пам'яті виділяється з купи. Після його використання цю пам'ять необхідно очистити за допомогою команди "delete".

Кожен розподіл пам’яті за допомогою «new» повинен завершуватися командою «delete». Якщо ні, ми не зникнемо з пам’яті.

Щоб це чітко показати на прикладі:

n = новий зразок_об'єкт;
Використання ******* реалізовано тут *******
видалити n;

Як показано, кожне нове повинно закінчуватись чи змінюватись командою delete. Тут n вказівник виділяється пам'яттю за допомогою команди "new" і посилається на нього або вказує на об'єкт під назвою "sample_object". Після завершення використання та функціонування вказівника ми повинні звільнити або звільнити пам'ять за допомогою команди "delete", як було зроблено вище.

Але у випадку збору сміття, пам'ять виділяється за допомогою команди "new", але її не потрібно видаляти вручну за допомогою "delete". У таких випадках збирач сміття періодично проводить перевірку на наявність вільної пам’яті. Якщо фрагмент пам'яті не вказується жодним об'єктом, він очищає або звільняє пам'ять, створюючи більше вільного простору.

Переваги та недоліки ручного управління пам’яттю

Переваги керування ручною пам’яттю полягають у тому, що користувач матиме повний контроль як над розподілом, так і з операціями розміщення даних, а також знає, коли виділяється нова пам’ять та коли вона розміщується чи випускається. Але у випадку збору сміття, в точно той же екземпляр після використання пам'ять не буде звільнена, вона буде звільнена, коли вона зіткнеться з нею під час періодичної роботи.

Також у випадку ручного управління пам'яттю деструктор буде викликаний в той самий момент, коли ми зателефонуємо на команду 'delete'. Але у випадку збирання сміття, яке не реалізується.

Існує кілька проблем, пов’язаних із використанням ручного управління пам'яттю. Іноді ми можемо спробувати подвоїти видалення зайнятої пам'яті. Коли ми видаляємо вже видалений покажчик або пам'ять, є ймовірність, що вказівник може посилатися на деякі інші дані і може бути використаний.

Інша проблема, яка виникає в ручному управлінні пам’яттю, - якщо ми отримаємо виняток під час виконання або використання нового виділеного пам’яті вказівника, він вийде з послідовності „new” та „delete”, і операція з випуском не буде виконується. Також можуть виникнути проблеми з витоком пам'яті.

Переваги та недоліки сміттєзбірника

Одним з головних недоліків збирання сміття є час, пов'язаний з циклом або процесором для пошуку невикористаної пам'яті та видалення її, навіть якщо користувач знає, яку пам'ять покажчика можна випустити, а не використовувати. Ще одним недоліком є ​​те, що ми не будемо знати час, коли він буде видалений, а також коли виклик деструктора.

Алгоритм збору сміття

Існує багато алгоритмів збору сміття, таких як підрахунок посилань, розмітка та розміщення, копіювання тощо. Давайте детально розглянемо один алгоритм для кращого розуміння. Наприклад, коли ми бачимо алгоритм підрахунку посилань, кожна динамічна пам'ять матиме кількість відліку. Коли створюється посилання, кількість посилань збільшуватиметься та щоразу, коли посилання буде видалено, кількість посилань зменшиться. Після того, як кількість посилань стає нульовою, видно, що пам'ять не використовується і її можна звільнити.

Цей алгоритм може бути реалізований в C ++, використовуючи певний тип вказівника. Конкретний тип вказівника повинен бути оголошений, і це може бути використано для таких цілей, як відстеження всіх створених посилань, відстеження еталонного під час створення та видалення посилання. Програма C ++ може містити як ручне управління пам’яттю, так і збирання сміття в одній програмі. Відповідно до потреби, може бути використаний або звичайний покажчик, або конкретний покажчик збору сміття.

Таким чином, підсумовуючи, збирання сміття - це метод, протилежний ручному керуванню пам'яттю. У сміттєзбірнику пам'ять звільняється автоматично на основі періодичного періоду часу або на основі конкретних критеріїв, які вказують, якщо вона більше не використовується. Обидва способи мають свої переваги та недоліки. Це можна реалізувати та використовувати відповідно до складності функції, залежно від мови, що використовується, та її обсягу.

Рекомендовані статті

Це посібник зі збирання сміття C ++. Тут ми обговорюємо ручне управління пам’яттю та алгоритм збору сміття разом з перевагами та недоліками. Ви також можете ознайомитися з іншими запропонованими нами статтями, щоб дізнатися більше -

  1. Конструктор і деструктор на Java
  2. С ++ рядкові функції
  3. Деструктор на Java
  4. Застосування C ++ в реальному світі
  5. Топ-11 особливостей та переваг C ++