logo

Collecte des déchets en C

Dans les langages informatiques, collecte des ordures est un élément crucial de la gestion de la mémoire. Il s'agit de la procédure par laquelle la mémoire d'un programme est automatiquement identifiée et libérée. La programmation C ne dispose pas de capacités intégrées de garbage collection car il s'agit d'un niveau faible langage de programmation. Cependant, il existe un certain nombre de bibliothèques qui offrent des fonctionnalités de garbage collection pour les programmes C. Dans cet article, nous examinerons le garbage collection en C et comment il est implémenté à l'aide du, Boehm-Demers-Weiser bibliothèque de garbage collector.

C propose des mécanismes de gestion de mémoire de bas niveau grâce à ses malloc() et fonctions gratuites() . Le méthode libre() est utilisé pour libérer de la mémoire lorsqu'elle n'est plus nécessaire, tandis que le fonction malloc() est utilisé pour allouer de la mémoire de manière dynamique pendant l'exécution. La syntaxe fondamentale de ces fonctions est la suivante :

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

Un pointeur vers le début de la mémoire allouée est renvoyé par le malloc() fonction en échange d’un argument précisant le nombre d’octets à allouer. La mémoire précédemment allouée par le méthode malloc() est libéré par le fonction libre() , le rendant accessible pour des allocations supplémentaires.

Bien que le système de gestion de la mémoire du C permette une grande flexibilité, il fait également peser la charge de la gestion de la mémoire sur le programmeur. Les fuites de mémoire peuvent résulter d'une mauvaise utilisation des routines de gestion de la mémoire lorsque la mémoire est allouée mais jamais libérée ou d'erreurs de segmentation, où l'accès à la mémoire est effectué après sa libération.

Une technique de gestion de la mémoire appelée collecte des ordures identifie et libère automatiquement la mémoire qui n'est plus utilisée par un programme. Collecte des ordures évite au programmeur de gérer la mémoire manuellement, ce qui réduit le risque de fuites de mémoire et d'erreurs de segmentation.

Pour le programme C, le Boehm-Demers-Weiser offres de bibliothèque de garbage collector collecte des déchets capacités. La mémoire peut être allouée à l'aide de l'ensemble de fonctions de la bibliothèque, qui peuvent également être utilisées pour identifier et libérer automatiquement la mémoire qui n'est plus utilisée. La bibliothèque emploie un marquer et balayer technique pour trouver et libérer la mémoire.

Syntaxe:

La syntaxe de base du Boehm-Demers-Weiser Les fonctions de la bibliothèque du garbage collector sont les suivantes :

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

Dans cette syntaxe, le Fonction GC_calloc() est utilisé pour allouer de la mémoire et l'initialiser à zéro , tandis que le Fonction GC_malloc() alloue la mémoire de manière dynamique. Semblable à la méthode realloc() en C, le GC_realloc() La fonction est utilisée pour réaffecter la mémoire. La libération de la mémoire s'effectue via le Méthode GC_free() .

Jetons un coup d'œil à une illustration de Boehm-Demers-Weiser bibliothèque de garbage collector en action. Le programme suivant utilise le Fonction GC_malloc() pour allouer de la mémoire à chaque nœud lors de la création d'une liste chaînée d'entiers. Après cela, les valeurs de la liste chaînée sont imprimées et le programme se termine ensuite.

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

Sortir:

La sortie suivante est produite lorsque le programme est exécuté :

 1 2 3 4 5 6 7 8 9 10 

Explication:

Dans cet exemple, nous utilisons d'abord le GC_INIT() fonction pour initialiser le garbage collector. Après cela, le nœud principal de la liste chaînée est créé à l'aide du Méthode GC_malloc() , et le pointeur actuel est modifié pour pointer vers lui. L'étape suivante consiste à utiliser une boucle pour ajouter plus de nœuds à la liste chaînée, en attribuant la valeur de chaque nœud au compteur de boucle. variable je et son prochain pointeur vers le nœud après lui dans la liste. Afin de signaler la fin de la liste, nous plaçons finalement le pointeur suivant du dernier nœud de la liste sur NUL .

Utilisant un boucle while pour parcourir la liste et imprimer la valeur de chaque nœud, puis nous imprimons les valeurs dans la liste chaînée. Enfin nous retourner 0 pour montrer que le programme s'est exécuté avec succès.

Conclusion

Dans cet article de blog, nous avons examiné Boehm-Demers-Weiser implémentation de la bibliothèque garbage collector en C. Nous avons examiné la syntaxe fondamentale des fonctions de la bibliothèque garbage collector et montré comment les utiliser dans un exemple de programme simple. Nous avons également parlé du résultat de l'exemple de programme et de son importance.

Dans l'ensemble, collecte des ordures est une approche cruciale qui peut aider les programmeurs C à gérer la mémoire de manière meilleure et plus efficace. Les programmeurs C peuvent bénéficier du garbage collection tout en utilisant un langage de bas niveau utilisant le Boehm-Demers-Weiser paquet de ramasse-miettes.