Какво представлява събирането на боклук C ++?

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

Малко езици се нуждаят от сметосъбирачи като част от езика за добра ефективност. Тези езици се наричат ​​езици, събрани от боклука. Например, Java, C # и повечето от скриптовите езици се нуждаят от събиране на боклук като част от тяхното функциониране. Като има предвид, че езици като C и C ++ поддържат ръчно управление на паметта, което работи подобно на колектора за боклук. Има малко езици, които поддържат събирането на боклука и ръчно управляваното разпределение / раздаване на паметта и в такива случаи ще се отделя отделна купчина памет на колектора за боклук и ръчната памет.

Някои от бъговете могат да бъдат предотвратени, когато се използва методът за събиране на боклука. Като:

  • проблем с висящия показалец, при който посочената памет вече е разместена, докато показалецът все още остава и сочи към различни преназначени данни или към вече изтрита памет
  • проблемът, който възниква, когато се опитаме да изтрием или раздадем памет втори път, която вече е изтрита или пренасочена към някакъв друг обект
  • премахва проблеми или грешки, свързани със структурите на данни и прави паметта и обработката на данни ефикасно
  • изтичане на паметта или проблем с изтощаването на паметта могат да бъдат избегнати

Нека видим подробно разбиране на ръчното управление на паметта срещу събирането на боклука, предимствата, недостатъците и как се реализира в C ++.

Ръчно управление на паметта

Динамично разпределената памет по време на изпълнение от грамадата трябва да бъде освободена, след като спрем да използваме тази памет. Динамично разпределената памет отнема памет от грамадата, която е безплатен запас от памет.

В C ++ това разпределение на паметта и разместване се извършват ръчно с помощта на команди като ново, изтриване. Използването на „нова“ памет се разпределя от грамадата. След използването му тази памет трябва да бъде изчистена с помощта на командата 'изтриване'.

Всяко разпределение на паметта с 'new' трябва да бъде завършено с команда 'delete'. Ако не, ще изчезнем от паметта.

За да го покажете ясно с пример:

n = нов образец_объект;
Използването на ******* се осъществява тук *******
изтрийте n;

Както е показано, всяка нова трябва да завършва или да се наклонява с команда за изтриване. Тук n показалец се разпределя памет с помощта на команда 'new' и е рефериран или насочен към обект, наречен 'sample_object'. След като приключи използването и функционирането на показалеца, трябва да освободим или освободим паметта, използвайки командата 'изтриване', както е направено по-горе.

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

Предимства и недостатъци на ръчното управление на паметта

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

Също в случай на ръчно управление на паметта, деструкторът ще бъде извикан в същия миг, когато извикаме командата „изтриване“. Но в случай на събиране на боклук, който не е приложен.

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

Друг проблем, който имаме при ръчното управление на паметта е, ако получим изключение по време на изпълнение или използване на новия памет, разпределен указател, той ще излезе от последователността на „ново“ и „изтриване“ и операцията по освобождаване няма да бъде извършва. Също така, може да има проблеми с изтичането на памет.

Предимства и недостатъци на боклука

Един основен недостатък на събирането на боклука е включеното време или включени CPU цикли за намиране на неизползваната памет и изтриването й, дори ако потребителят знае кой паметта на паметта може да бъде освободена и да не се използва. Друг недостатък е, че няма да знаем времето, когато е изтрито, нито кога е извикан деструкторът.

Алгоритъм за събиране на боклук

Има много алгоритми за събиране на боклук, като преброяване на референции, маркиране и почистване, копиране и др. Нека видим подробно един алгоритъм за по-добро разбиране. Например, когато видим алгоритъм за преброяване на референтни стойности, всяка динамична памет ще има референтен брой. Когато се създаде препратка, референтният брой ще се увеличава и всеки път, когато референцията бъде изтрита, референтният брой се намалява. След като референтният брой стане нула, това показва, че паметта не се използва и може да бъде освободена.

Този алгоритъм може да бъде реализиран в C ++ с помощта на конкретен тип показалец. Трябва да бъде деклариран конкретен тип показалец и това може да се използва за цели като проследяване на всички създадени референции, проследяване на референтния брой при създаване и изтриване на референцията. Програмата C ++ може да съдържа както ръчно управление на паметта, така и събиране на боклука в една и съща програма. Според нуждите може да се използва или нормалният указател, или специфичният указател за събиране на боклук.

Така че, да обобщим, събирането на боклука е метод, противоположен на ръчното управление на паметта. В контейнера за събиране на боклук паметта се освобождава автоматично въз основа на периодично време или въз основа на конкретни критерии, които показват дали вече не се използват. И двата метода имат своите предимства и недостатъци. Това може да се реализира и използва според сложността на функцията, в зависимост от използвания език и обхвата му.

Препоръчителни статии

Това е ръководство за събиране на боклук C ++. Тук обсъждаме ръчното управление на паметта и алгоритъма за събиране на боклука заедно с предимствата и недостатъците. Можете да разгледате и другите ни предложени статии, за да научите повече -

  1. Конструктор и деструктор в Java
  2. С ++ струнни функции
  3. Destructor в Java
  4. Приложения на C ++ в реалния свят
  5. Топ 11 функции и предимства на C ++