Co je C ++ Garbage Collection?

Sběr odpadu je technika správy paměti. Jedná se o samostatnou metodu automatické správy paměti, která se používá v programovacích jazycích, kde ruční správa paměti není upřednostňována nebo prováděna. V manuálním způsobu správy paměti je uživatel povinen uvést paměť, která je používána a která může být uvolněna, zatímco sběratel odpadu shromažďuje paměť, která je obsazena proměnnými nebo objekty, které se již v programu již nepoužívají. Sběratelé odpadu budou spravovat pouze paměť, ostatní zdroje, jako jsou destruktory, okno s interakcí uživatele nebo soubory, nebudou zpracovávány sběrači odpadu.

Jen málo jazyků potřebuje sběratele odpadu jako součást jazyka pro dobrou účinnost. Tyto jazyky se nazývají jazyky odvozené z odpadu. Například Java, C # a většina skriptovacích jazyků potřebuje jako součást jejich fungování sbírku odpadků. Zatímco jazyky jako C a C ++ podporují ruční správu paměti, která funguje podobně jako sběratel odpadu. Existuje jen málo jazyků, které podporují sběr odpadu i manuálně spravovanou alokaci / deallokaci paměti, a v takových případech bude sběrateli odpadu a manuální paměti přidělena samostatná hromada paměti.

Některým chybám lze zabránit, když je použita metoda sběru odpadu. Jako:

  • problém s houpajícím se ukazatelem, ve kterém je namířená paměť již přidělená, zatímco ukazatel stále zůstává a ukazuje na různá přiřazená data nebo již vymazanou paměť
  • problém, ke kterému dochází při pokusu o vymazání nebo přemístění paměti podruhé, která již byla odstraněna nebo znovu přidělena jinému objektu
  • odstraňuje problémy nebo chyby spojené s datovými strukturami a efektivně zpracovává paměť a data
  • nedochází k únikům paměti nebo k vyčerpání paměti

Podívejme se na podrobné pochopení manuální správy paměti vs. sběru odpadu, výhod, nevýhod a způsobu implementace v C ++.

Manuální správa paměti

Jakmile přestaneme používat tuto paměť, je třeba uvolnit dynamicky přidělenou paměť během doby spuštění z haldy. Dynamicky přidělená paměť bere paměť z haldy, což je volné úložiště paměti.

V C ++ se toto přidělení paměti a deallocation provádí ručně pomocí příkazů, jako je nový, odstranit. Použití 'nové' paměti je přiděleno z haldy. Po použití musí být tato paměť vymazána pomocí příkazu 'delete'.

Každé přidělení paměti s 'new' musí být dokončeno příkazem 'delete'. Pokud ne, vyjdeme z paměti.

Jasně ukázat na příkladu:

n = nový sample_object;
******* použití je zde implementováno *******
smazat n;

Jak je znázorněno, každý nový by měl skončit nebo naklonit příkazem k odstranění. Zde je ukazatel alokován paměť pomocí 'nového' příkazu a je odkazován nebo odkazuje na objekt nazvaný 'sample_object'. Jakmile je používání a fungování ukazatele dokončeno, měli bychom uvolnit nebo uvolnit paměť pomocí příkazu „odstranit“, jak je uvedeno výše.

Ale v případě sběru odpadu je paměť přidělena pomocí 'nového' příkazu, ale nemusí být ručně uvolněna pomocí 'odstranit'. V takových případech sběratel odpadu spouští periodicky kontrolu volné paměti. Pokud část paměti není namířena žádným objektem, vymaže nebo uvolní paměť, čímž vytvoří více volného haldy.

Výhody a nevýhody ruční správy paměti

Výhodou ruční správy paměti je to, že uživatel bude mít úplnou kontrolu nad přidělováním i přidělováním operací a také ví, kdy je přidělena nová paměť a kdy je přidělena nebo uvolněna. Ale v případě sběru odpadu, ve stejném případě po použití nebude paměť uvolněna, bude uvolněna, když se s ní setká během periodické operace.

Také v případě manuální správy paměti bude destruktor vyvolán ve stejnou chvíli, kdy zavoláme příkaz 'vymazat'. Ale v případě sběratele odpadu to není implementováno.

S ručním ovládáním paměti je spojeno několik problémů. Někdy bychom mohli mít tendenci zdvojnásobit vymazání obsazené paměti. Když odstraníme již smazaný ukazatel nebo paměť, je pravděpodobné, že ukazatel může odkazovat na některá další data a může být používán.

Dalším problémem, který máme v manuální správě paměti, je to, že pokud dostaneme výjimku během provádění nebo používání nového ukazatele přidělené paměti, vyjde z posloupnosti 'new' a 'delete' a operace uvolnění nebude provedeno. Také mohou nastat problémy s únikem paměti.

Výhody a nevýhody sběratele odpadu

Jednou hlavní nevýhodou sběru odpadu je čas nebo cykly CPU, které jsou potřebné k nalezení nevyužité paměti a její odstranění, i když uživatel ví, která ukazatelová paměť může být uvolněna a není používána. Další nevýhodou je, že nebudeme znát čas, kdy je odstraněn, ani když je vyvolán destruktor.

Algoritmus sběru odpadu

Existuje mnoho algoritmů pro sběr odpadu, jako je počítání referencí, značení a rozmítání, kopírování atd. Pro lepší pochopení se podrobně podíváme na jeden algoritmus. Například, když uvidíme algoritmus počítání referencí, každá dynamická paměť bude mít počet referencí. Když je vytvořen odkaz, počet odkazů se zvýší a kdykoli je odkaz vymazán, počet odkazů se sníží. Jakmile počet referencí klesne na nulu, ukazuje, že paměť není využívána a může být uvolněna.

Tento algoritmus lze implementovat v C ++ pomocí specifického typu ukazatele. Měl by být deklarován specifický typ ukazatele, který může být použit pro účely, jako je sledování všech vytvořených odkazů, sledování počtu odkazů, když je odkaz vytvořen a odstraněn. Program C ++ může obsahovat jak manuální správu paměti, tak i sběr odpadků ve stejném programu. Podle potřeby lze použít buď normální ukazatel nebo ukazatel ukazatele sběru odpadu.

Abychom to shrnuli, sběr odpadu je metoda opačná než ruční správa paměti. U sběratele odpadu je paměť uvolňována automaticky na základě periodického časového rozvrhu nebo na základě specifických kritérií, která oznamují, zda se již nepoužívá. Obě metody mají své vlastní výhody a nevýhody. To lze implementovat a použít podle složitosti funkce v závislosti na použitém jazyce a jeho rozsahu.

Doporučené články

Toto je průvodce C ++ Garbage Collection. Zde diskutujeme o ruční správě paměti a algoritmu pro sběr odpadu spolu s výhodami a nevýhodami. Další informace naleznete také v dalších navrhovaných článcích -

  1. Konstruktor a ničitel v Javě
  2. Funkce řetězce C ++
  3. Destruktor v Javě
  4. Aplikace C ++ v reálném světě
  5. Prvních 11 funkcí a výhod C ++

Kategorie: