Mi a C ++ szemetes gyűjtés?
A szemétszedés memóriakezelési technika. Ez egy különálló automatikus memóriakezelési módszer, amelyet olyan programozási nyelveken használnak, ahol a kézi memóriakezelés nem részesül előnyben vagy nem történik meg. A kézi memóriakezelési módszerben a felhasználónak meg kell említenie a használt memóriát, amely elosztható, míg a szemetesgyűjtő olyan memóriát gyűjt, amelyet olyan változók vagy tárgyak foglalnak el, amelyeket a programban már nem használnak. Csak a memóriát fogják kezelni a szemetesgyűjtők, más erőforrásokat, mint például a pusztítókat, a felhasználói interakciós ablakot vagy a fájlokat a szemetesgyűjtő nem kezeli.
A jó hatékonyság érdekében kevés nyelvre van szükség a hulladékgyűjtőkre a nyelv részeként. Ezeket a nyelveket szemétgyűjtő nyelveknek nevezik. Például a Java, a C # és a legtöbb szkriptnyelv működésének részeként szemetet kell gyűjteni. Míg a C és a C ++ nyelvek támogatják a kézi memóriakezelést, amely hasonlóan működik, mint a szemétszedő. Kevés olyan nyelv támogatja a szemetek gyűjtését és a kézilag kezelt memóriaelosztást / -allokációt, és ilyen esetekben külön-külön memória-halom lesz a hulladékgyűjtő és a kézi memória számára.
Néhány hibát a hulladékgyűjtési módszer használatakor el lehet kerülni. Úgymint:
- lógó mutatóprobléma, amelyben a mutatott memória már el van osztva, míg a mutató továbbra is fennáll, és rámutat arra, hogy más újra kiosztott adatok vagy már törölt memória vannak
- az a probléma, amely akkor lép fel, amikor megpróbálunk törölni vagy újból elhelyezni egy olyan memóriát, amelyet már töröltünk, vagy valamilyen más objektumhoz áthelyeztünk
- eltávolítja az adatszerkezetekkel kapcsolatos problémákat vagy hibákat, hatékonyan kezeli a memóriát és az adatkezelést
- elkerülhetőek a memóriaszivárgások vagy a memória kimerülésének problémái
Lásd a kézi memóriakezelés és a szemétgyűjtés, az előnyök, hátrányok, valamint a C ++ alkalmazásban történő alkalmazásának részletes megértését.
Kézi memóriakezelés
A halomból dinamikusan elosztott memóriát fel kell szabadítani, amint abbahagyjuk a memória használatát. A dinamikusan elosztott memória a memóriát veszi a halomból, amely szabad memóriatár.
A C ++ rendszerben ez a memóriaelosztás és az üzlethelyzet manuálisan történik, például az új, törlés parancsokkal. Az „új” memória felhasználása a halomból történik. Használata után ezt a memóriát törölni kell a 'törlés' paranccsal.
Minden „új” memóriaelosztást „töröl” paranccsal kell befejezni. Ha nem, akkor eltűnik a memória.
Hogy egy példával világosan megmutassuk:
n = új minta_objektum;
A ******* használat itt megvalósul *******
n törlés;
Amint az ábrán látható, minden újnak véget kell érnie vagy meg kell emelkednie egy törlési paranccsal. Az n mutatóra a memória az 'új' paranccsal van hozzárendelve, és a 'minta_objekt' elnevezésű objektumra hivatkozik vagy mutat rá. Miután a mutató használata és működése befejeződött, fel kell szabadítania vagy fel kell szabadítania a memóriát a 'törlés' paranccsal, a fentiek szerint.
Szemétgyűjtés esetén a memóriát az 'új' paranccsal kell kiosztani, de azt nem kell manuálisan kiadni az 'törlés' gombbal. Ilyen esetekben a szemetesgyűjtő rendszeresen ellenőrzi, hogy nincs-e szabad memória. Ha egy memóriadarabot semmilyen tárgy nem mutat, az törli vagy felszabadítja a memóriát, így több szabad terület halmozódik fel.
A kézi memóriakezelés előnyei és hátrányai
A kézi memóriakezelés előnyei abban állnak, hogy a felhasználó teljes ellenőrzést gyakorolhat mind a kiosztási, mind az üzletkiosztási műveletek felett, és azt is tudja, mikor van egy új memória kiosztva, és mikor osztják el vagy engedik el. Szemétgyűjtés esetén ugyanakkor a használat után a memória nem kerül felszabadításra, akkor felszabadul, amikor az időszakos művelet során találkozik vele.
A kézi memóriakezelés esetén a pusztítót ugyanabban a pillanatban hívják meg, amikor a 'törlés' parancsot hívjuk. De a nem végrehajtott hulladékgyűjtő esetén.
Néhány kérdés kapcsolódik a kézi memóriakezelés használatához. Előfordulhat, hogy duplán töröljük a foglalt memóriát. A már törölt mutató vagy memória törlésekor előfordulhat, hogy a mutató más adatokra hivatkozik, és felhasználható lehet.
Egy másik probléma, amely a kézi memóriakezelés során felmerül, ha kivételt kap az új memóriához hozzárendelt mutató végrehajtása vagy használata során, akkor az kikerül az „új” és a „törlés” sorozatából, és a kiadási művelet nem lesz teljesített. Ezenkívül problémákat okozhat a memória szivárgása.
A szemétgyűjtő előnyei és hátrányai
A szemétgyűjtés egyik fő hátránya a fel nem használt memória megtalálásához és törléséhez szükséges idő vagy a CPU-ciklusok akkor is, ha a felhasználó tudja, melyik mutatómemória szabadon engedhető és nem használható. Egy másik hátrány az, hogy nem tudjuk, mikor töröljük, vagy mikor hívják fel a pusztítót.
Szemétgyűjtési algoritmus
Számos hulladékgyűjtési algoritmus létezik, például referenciaszámlálás, jelölés és söpörés, másolás, stb. A jobb megértés érdekében lássuk el egy algoritmust részletesen. Például, amikor látjuk a referenciaszámláló algoritmust, minden dinamikus memória referenciaszámmal fog rendelkezni. Referencia létrehozásakor a referenciaszám növekszik, és ha a referenciát törlik, akkor a referenciaszám csökken. Amint a referenciaszám nullá válik, ez azt mutatja, hogy a memória kihasználatlan és felszabadítható.
Ez az algoritmus megvalósítható C ++ formában egy adott mutatótípus felhasználásával. Egy adott mutatótípust be kell jelenteni, és ez felhasználható többek között az összes létrehozott referencia nyomon követésére, a referenciaszámok nyomon követésére a referencia létrehozásakor és törlésekor. A C ++ program tartalmazhatja a kézi memóriakezelést és a hulladékgyűjtést ugyanabban a programban. Igény szerint felhasználható akár a normál mutató, akár az adott szemétszedő mutató.
Összefoglalva tehát, a szemetes gyűjtés a kézi memóriakezeléssel ellentétes módszer. A szemetesgyűjtőben a memória automatikusan felszabadul időszakos időnként vagy meghatározott kritériumok alapján, amelyek megmutatják, hogy már nem használják-e. Mindkét módszernek megvannak a maga előnyei és hátrányai. Ez a függvény összetettsége szerint valósítható meg és használható, a használt nyelvetől és hatályától függően.
Ajánlott cikkek
Ez egy útmutató a C ++ szemétgyűjtéshez. Itt tárgyaljuk a kézi memóriakezelést és a szemetesgyűjtési algoritmust, valamint az előnyöket és hátrányokat. A további javasolt cikkeken keresztül további információkat is megtudhat -
- Konstruktor és romboló Java-ban
- C ++ karakterlánc-funkciók
- Destructor Java
- C ++ alkalmazások a valós világban
- A C ++ 11 legfontosabb tulajdonságai és előnyei