În limbaje informatice, colectarea gunoiului este o componentă crucială a managementului memoriei. Este procedura prin care memoria unui program este identificată și eliberată automat. Programarea C nu are capabilități încorporate de colectare a gunoiului deoarece este a nivel scăzut limbaj de programare. Cu toate acestea, există o serie de biblioteci care oferă caracteristici de colectare a gunoiului pentru programele C. În acest articol, vom examina colectarea gunoiului în C și modul în care este implementată folosind, Boehm-Demers-Weiser biblioteca de gunoi.
C oferă mecanisme de gestionare a memoriei de nivel scăzut prin intermediul acestuia malloc() și funcții free(). . The metoda free(). este folosit pentru a elibera memoria atunci când nu mai este necesară, în timp ce funcția malloc(). este folosit pentru a aloca memorie dinamic în timpul rulării. Sintaxa fundamentală a acestor funcții este următoarea:
void* malloc(size_t size); void free(void* ptr);
Un pointer către începutul memoriei alocate este returnat de către malloc() funcția în schimbul unui argument care specifică numărul de octeți care trebuie alocați. Memoria care a fost alocată anterior de către metoda malloc(). este eliberat de către funcția free(). , făcându-l accesibil pentru alocări suplimentare.
În timp ce sistemul de gestionare a memoriei al lui C permite multă flexibilitate, pune, de asemenea, povara gestionării memoriei asupra programatorului. Scurgerile de memorie pot rezulta din utilizarea necorespunzătoare a rutinelor de gestionare a memoriei atunci când memoria este alocată, dar niciodată eliberată sau erori de segmentare, în cazul în care memoria este accesată după ce a fost eliberată.
O tehnică de gestionare a memoriei numită colectarea gunoiului identifică și eliberează automat memoria care nu mai este utilizată de un program. Colectarea gunoiului face inutil ca programatorul să gestioneze manual memoria, ceea ce reduce riscul pierderilor de memorie și erorilor de segmentare.
Pentru programul C, Boehm-Demers-Weiser oferte bibliotecă gunoi colectarea gunoiului capabilități. Memoria poate fi alocată folosind colecția de funcții a bibliotecii, care poate fi folosită și pentru a identifica și elibera automat memoria care nu mai este utilizată. Biblioteca angajează a marca-și-mătură tehnică de a găsi și elibera memoria.
Sintaxă:
Sintaxa de bază a Boehm-Demers-Weiser Funcțiile bibliotecii garbage collector sunt după cum urmează:
#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);
În această sintaxă, Funcția GC_calloc(). este folosit pentru a aloca memorie și pentru a o inițializa zero , întrucât Funcția GC_malloc(). alocă memoria în mod dinamic. Similar cu metoda realloc(). în C, GC_realloc() funcția este utilizată pentru a realoca memoria. Eliberarea memoriei se realizează prin intermediul Metoda GC_free(). .
Să aruncăm o privire la o ilustrare a Boehm-Demers-Weiser biblioteca colector de gunoi în acțiune. Următorul program folosește Funcția GC_malloc(). pentru a aloca memorie pentru fiecare nod pe măsură ce construiește o listă legată de numere întregi. După aceea, valorile listei legate sunt tipărite, iar programul se încheie.
#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; }
Ieșire:
Următoarea ieșire este produsă atunci când programul este rulat:
1 2 3 4 5 6 7 8 9 10
Explicaţie:
În acest exemplu, folosim mai întâi GC_INIT() funcția de inițializare a colectorului de gunoi. După aceea, nodul principal al listei legate este creat utilizând Metoda GC_malloc(). , iar indicatorul curent este schimbat pentru a indica el. Următorul pas este să folosiți o buclă pentru a adăuga mai multe noduri la lista legată, atribuind valoarea fiecărui nod contorului de bucle. variabila i și următorul indicator către nodul după acesta din listă. Pentru a semnala sfârșitul listei, în cele din urmă setăm următorul pointer al ultimului nod din listă la NUL .
Folosind un buclă while pentru a parcurge lista și a tipări valoarea fiecărui nod, apoi tipărim valorile din lista legată. În cele din urmă, noi întoarce 0 pentru a arăta că programul a rulat cu succes.
Concluzie
În acest articol de blog, ne-am uitat la Boehm-Demers-Weiser Implementarea bibliotecii garbage collector a garbage collection în C. Am examinat sintaxa fundamentală a funcțiilor bibliotecii garbage collector și am arătat cum să le folosim într-un exemplu de program simplu. Am vorbit, de asemenea, despre rezultatul programului exemplu și despre importanța acestuia.
Per total, colectarea gunoiului este o abordare crucială care poate ajuta programatorii C în gestionarea mai bună și mai eficientă a memoriei. Programatorii C pot profita de colectarea gunoiului în timp ce folosesc un limbaj de nivel scăzut folosind Boehm-Demers-Weiser pachet colector de gunoi.