logo

Zbiórka śmieci w C

W językach komputerowych zbieranie śmieci jest kluczowym elementem zarządzania pamięcią. Jest to procedura automatycznego identyfikowania i zwalniania pamięci programu. Programowaniu w języku C brakuje wbudowanych możliwości usuwania elementów bezużytecznych, ponieważ jest to plik a niski poziom język programowania. Istnieje jednak wiele bibliotek oferujących funkcje usuwania elementów bezużytecznych dla programów C. W tym artykule przeanalizujemy zbieranie śmieci w C i sposób jego implementacji za pomocą, Boehma-Demersa-Weisera biblioteka zbierająca śmieci.

C oferuje mechanizmy zarządzania pamięcią niskiego poziomu poprzez swoje malloc() I funkcje darmowe(). . The metoda free(). służy do zwalniania pamięci, gdy nie jest już potrzebna, natomiast funkcja malloc(). służy do dynamicznego przydzielania pamięci w czasie wykonywania. Podstawowa składnia tych funkcji jest następująca:

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

Wskaźnik do początku przydzielonej pamięci jest zwracany przez metodę malloc() funkcję w zamian za argument określający liczbę bajtów do przydzielenia. Pamięć, która została wcześniej przydzielona przez metoda malloc(). jest wydawana przez funkcja free(). , dzięki czemu będzie on dostępny w przypadku dodatkowych przydziałów.

Chociaż system zarządzania pamięcią w C pozwala na dużą elastyczność, nakłada również ciężar zarządzania pamięcią na programistę. Wycieki pamięci mogą wynikać z niewłaściwego użycia procedur zarządzania pamięcią, gdy pamięć jest przydzielana, ale nigdy nie jest zwalniana, lub z błędów segmentacji, w których dostęp do pamięci jest uzyskiwany po jej zwolnieniu.

Technika zarządzania pamięcią zwana zbieranie śmieci automatycznie identyfikuje i zwalnia pamięć, która nie jest już używana przez program. Zbieranie śmieci sprawia, że ​​programista nie musi już ręcznie zarządzać pamięcią, co zmniejsza ryzyko wycieków pamięci i błędów segmentacji.

W przypadku programu C, Boehma-Demersa-Weisera oferty bibliotek zbierających śmieci zbieranie śmieci możliwości. Pamięć można alokować za pomocą zbioru funkcji biblioteki, które można również wykorzystać do automatycznego identyfikowania i zwalniania pamięci, która nie jest już używana. W bibliotece zatrudniony jest m.in zaznacz i zamiataj technika odnajdywania i zwalniania pamięci.

Składnia:

Podstawowa składnia Boehma-Demersa-Weisera Funkcje biblioteki modułu zbierającego elementy bezużyteczne są następujące:

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

W tej składni, Funkcja GC_calloc(). służy do alokacji pamięci i inicjowania jej zero , natomiast Funkcja GC_malloc(). przydziela pamięć dynamicznie. Podobny do metoda realloc(). w C, GC_realloc() funkcja służy do ponownego przypisania pamięci. Zwalnianie pamięci odbywa się poprzez Metoda GC_free(). .

Przyjrzyjmy się ilustracji pt Boehma-Demersa-Weisera Biblioteka zbierająca śmieci w akcji. Poniższy program korzysta z Funkcja GC_malloc(). przydzielać pamięć dla każdego węzła podczas tworzenia połączonej listy liczb całkowitych. Następnie drukowane są wartości połączonej listy, a program kończy działanie.

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

Wyjście:

Po uruchomieniu programu generowane są następujące dane wyjściowe:

 1 2 3 4 5 6 7 8 9 10 

Wyjaśnienie:

W tym przykładzie najpierw użyjemy GC_INIT() funkcja inicjująca moduł zbierający elementy bezużyteczne. Następnie tworzony jest węzeł główny połączonej listy za pomocą Metoda GC_malloc(). , a bieżący wskaźnik zostanie zmieniony tak, aby wskazywał na niego. Następnym krokiem jest użycie pętli w celu dodania kolejnych węzłów do połączonej listy, przypisując wartość każdego węzła do licznika pętli zmienna I i jego następny wskaźnik do węzła znajdującego się po nim na liście. Aby zasygnalizować koniec listy, ostatecznie ustawiamy kolejny wskaźnik ostatniego węzła na liście na ZERO .

Używać pętla while aby przejrzeć listę i wydrukować wartość każdego węzła, a następnie wydrukować wartości z połączonej listy. Wreszcie my zwróć 0 aby pokazać, że program przebiegł pomyślnie.

Wniosek

W tym artykule na blogu przyjrzeliśmy się Boehma-Demersa-Weisera Implementacja wyrzucania elementów bezużytecznych w bibliotece C. Przeanalizowaliśmy podstawową składnię funkcji bibliotecznych modułu zbierającego elementy bezużyteczne i pokazaliśmy, jak z nich korzystać w prostym przykładowym programie. Rozmawialiśmy także o wynikach przykładowego programu i jego znaczeniu.

Ogólnie, zbieranie śmieci to kluczowe podejście, które może pomóc programistom C w lepszym i bardziej efektywnym zarządzaniu pamięcią. Programiści C mogą czerpać korzyści z usuwania śmieci, korzystając z języka niskiego poziomu za pomocą Boehma-Demersa-Weisera pakiet śmieciarki.