logo

Szemétgyűjtés C-ben

Számítógépes nyelveken, szemétgyüjtés a memóriakezelés döntő összetevője. Ez az eljárás egy program memóriájának automatikus azonosítására és felszabadítására. A C programozásból hiányoznak a beépített szemétgyűjtési képességek, mert a alacsony szint programozási nyelv. Azonban számos könyvtár kínál szemétgyűjtési szolgáltatásokat a C-programokhoz. Ebben a cikkben megvizsgáljuk a szemétgyűjtést C-ben, és azt, hogyan valósítható meg a Boehm-Demers-Weiser szemétgyűjtő könyvtár.

char be string java

A C alacsony szintű memóriakezelési mechanizmusokat kínál malloc() és free() függvények . A free() metódus a memória felszabadítására szolgál, amikor már nincs rá szükség, míg a malloc() függvény a memória dinamikus lefoglalására szolgál futás közben. Ezeknek a függvényeknek az alapvető szintaxisa a következő:

 void* malloc(size_t size); void free(void* ptr); 

A lefoglalt memória elejére mutató mutatót ad vissza a malloc() függvényt egy argumentumért cserébe, amely meghatározza az allokálandó bájtok számát. A memória, amelyet korábban a malloc() metódus kiadja a free() függvény , amely további kiosztások számára elérhetővé teszi.

Míg a C memóriakezelő rendszere nagyfokú rugalmasságot tesz lehetővé, a memóriakezelés terhét is a programozóra hárítja. Memóriaszivárgás a memóriakezelési rutinok helytelen használatából eredhet, amikor a memória le van foglalva, de soha nem szabadul fel, vagy szegmentációs hibákból, amikor a memóriához a felszabadítás után hozzáférnek.

Az úgynevezett memóriakezelési technika szemétgyüjtés automatikusan azonosítja és felszabadítja a program által már nem használt memóriát. Szemétgyüjtés szükségtelenné teszi a programozó számára a memória manuális kezelését, ami csökkenti a memóriaszivárgás és a szegmentálási hibák kockázatát.

C program esetén a Boehm-Demers-Weiser szemétgyűjtő könyvtári ajánlatok szemétgyűjtés képességeit. A memória a könyvtár függvénygyűjteményével foglalható le, amely a már nem használt memória automatikus azonosítására és felszabadítására is használható. A könyvtárban a mark-and-sweep memória megtalálásának és felszabadításának technikája.

Szintaxis:

Az alapvető szintaxis a Boehm-Demers-Weiser A szemétgyűjtő könyvtár funkciói a következők:

 #include void* GC_malloc(size_t size); void* GC_calloc(size_tnmemb, size_t size); void* GC_realloc(void* ptr, size_t size); void GC_free(void* ptr); 

Ebben a szintaxisban a GC_calloc() függvény memória lefoglalására és inicializálására szolgál nulla , míg a GC_malloc() függvény dinamikusan allokálja a memóriát. Hasonló a realloc() metódus C-ben a GC_realloc() funkció a memória átrendelésére szolgál. A memória felszabadítása a GC_free() metódus .

Nézzünk egy illusztrációt a Boehm-Demers-Weiser szemétgyűjtő könyvtár működés közben. A következő program a GC_malloc() függvény hogy lefoglalja a memóriát az egyes csomópontokhoz, miközben az egész számok összekapcsolt listáját állítja össze. Ezt követően a linkelt lista értékei kinyomtatásra kerülnek, majd a program leáll.

 #include #include typedef struct node { int value; struct node* next; } node; int main() { GC_INIT(); node* head = GC_malloc(sizeof(node)); node* current = head; for (int i = 1; ivalue = i; current->next = GC_malloc(sizeof(node)); current = current->next; } current->next = NULL; current = head; while (current != NULL) { printf('%d
', current->value); current = current->next; } return 0; } 

Kimenet:

A program futtatásakor a következő kimenet jön létre:

 1 2 3 4 5 6 7 8 9 10 

Magyarázat:

Ebben a példában először a GC_INIT() funkció a szemétgyűjtő inicializálására. Ezt követően a csatolt lista fejcsomópontja létrejön a GC_malloc() metódus , és az aktuális mutató rámutat. A következő lépés egy hurok használatával további csomópontok hozzáadása a hivatkozott listához, minden csomópont értékét hozzárendelve a hurokszámlálóhoz. változó i és a következő mutató a listában az utána lévő csomópontra. A lista végének jelzésére végül a lista utolsó csomópontjának következő mutatóját a következőre állítjuk NULLA .

Használva míg hurok hogy végigmegyünk a listán és kinyomtassuk az egyes csomópontok értékét, majd kinyomtatjuk az értékeket a linkelt listában. Végül mi vissza 0 megmutatni, hogy a program sikeresen futott.

Következtetés

Ebben a blogcikkben megvizsgáltuk a Boehm-Demers-Weiser A szemétgyűjtő könyvtár szemétgyűjtési megvalósítása C nyelven. Megvizsgáltuk a szemétgyűjtő könyvtári függvények alapvető szintaxisát, és megmutattuk, hogyan használhatók fel egy egyszerű példaprogramban. Szó esett a mintaprogram eredményéről és annak fontosságáról is.

gyors válogatás

Átfogó, szemétgyüjtés kulcsfontosságú megközelítés, amely segítheti a C programozókat a jobb és hatékonyabb memóriakezelésben. A C programozók profitálhatnak a szemétgyűjtésből, miközben alacsony szintű nyelvet használnak a Boehm-Demers-Weiser szemétgyűjtő csomag.