logo

Събиране на боклук в C

На компютърните езици, събиране на боклук е ключов компонент от управлението на паметта. Това е процедура за автоматично идентифициране и освобождаване на паметта на програмата. В програмирането на C липсват вградени възможности за събиране на боклук, защото е a ниско ниво програмен език. Има обаче редица библиотеки, които предлагат функции за събиране на боклук за C програми. В тази статия ще разгледаме събирането на боклук в C и как се прилага с помощта на, Бьом-Демерс-Вайзер библиотека за събиране на боклук.

C предлага механизми за управление на паметта на ниско ниво чрез своя malloc() и функции free(). . The метод free(). се използва за освобождаване на памет, когато вече не е необходима, докато функция malloc(). се използва за динамично разпределяне на памет по време на изпълнение. Основният синтаксис на тези функции е както следва:

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

Указател към началото на разпределената памет се връща от malloc() функция в замяна на аргумент, указващ броя байтове, които да бъдат разпределени. Паметта, която преди това е била разпределена от метод malloc(). се освобождава от функция free(). , което го прави достъпен за допълнителни разпределения.

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

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

За C програма, Бьом-Демерс-Вайзер предлага библиотека за събиране на боклук събиране на боклук възможности. Паметта може да бъде разпределена с помощта на колекцията от функции на библиотеката, която също може да се използва за автоматично идентифициране и освобождаване на памет, която вече не се използва. В библиотеката работят а маркиране и почистване техника за намиране и освобождаване на паметта.

Синтаксис:

Основният синтаксис на Бьом-Демерс-Вайзер функциите на библиотеката за събиране на боклук са както следва:

 #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); 

В този синтаксис, Функция GC_calloc(). се използва за разпределяне на паметта и нейното инициализиране нула , като има предвид, че Функция GC_malloc(). разпределя паметта динамично. Подобно на метод realloc(). в C, the GC_realloc() функция се използва за преназначаване на памет. Освобождаването на паметта се осъществява чрез Метод GC_free(). .

Нека да разгледаме илюстрация на Бьом-Демерс-Вайзер библиотека за събиране на боклук в действие. Следващата програма използва Функция GC_malloc(). за разпределяне на памет за всеки възел, докато изгражда свързан списък от цели числа. След това стойностите на свързания списък се отпечатват и програмата се прекратява.

 #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; } 

Изход:

Следният изход се получава при изпълнение на програмата:

listnode
 1 2 3 4 5 6 7 8 9 10 

Обяснение:

В този пример първо използваме GC_INIT() функция за инициализиране на събирача на отпадъци. След това главният възел на свързания списък се създава с помощта на Метод GC_malloc(). и текущият показалец се променя, за да сочи към него. Следващата стъпка е да използвате цикъл, за да добавите повече възли към свързания списък, като присвоите стойността на всеки възел на брояча на цикъла променлива i и неговия следващ указател към възела след него в списъка. За да сигнализираме края на списъка, накрая задаваме следващия указател на последния възел в списъка на НУЛА .

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

Заключение

В тази статия в блога разгледахме Бьом-Демерс-Вайзер реализация на библиотеката за събиране на боклук за събиране на боклук в C. Разгледахме основния синтаксис на функциите на библиотеката за събиране на боклук и показахме как да ги използваме в проста примерна програма. Говорихме също за изхода на примерната програма и нейното значение.

като цяло, събиране на боклук е ключов подход, който може да помогне на програмистите на C за по-добро и по-ефективно управление на паметта. C програмистите могат да се възползват от събирането на боклука, докато използват език на ниско ниво, използвайки Бьом-Демерс-Вайзер пакет за събиране на боклук.