Qu'est-ce que C ++ Garbage Collection?

La récupération de place est une technique de gestion de la mémoire. Il s'agit d'une méthode de gestion de mémoire automatique distincte qui est utilisée dans les langages de programmation où la gestion manuelle de la mémoire n'est pas préférée ou effectuée. Dans la méthode de gestion manuelle de la mémoire, l'utilisateur doit mentionner la mémoire en cours d'utilisation et qui peut être désallouée, tandis que le garbage collector collecte la mémoire occupée par des variables ou des objets qui ne sont plus utilisés dans le programme. Seule la mémoire sera gérée par les garbage collector, les autres ressources telles que les destructeurs, la fenêtre d'interaction utilisateur ou les fichiers ne seront pas gérées par le garbage collector.

Peu de langues ont besoin de ramasse-miettes dans le langage pour une bonne efficacité. Ces langues sont appelées langues récupérées par les ordures. Par exemple, Java, C # et la plupart des langages de script nécessitent un ramasse-miettes dans le cadre de leur fonctionnement. Tandis que des langages tels que C et C ++ prennent en charge la gestion manuelle de la mémoire qui fonctionne de manière similaire au garbage collector. Il existe peu de langues qui prennent en charge à la fois le garbage collection et l'allocation / désallocation de mémoire gérée manuellement et dans de tels cas, un tas de mémoire distinct sera alloué au garbage collector et à la mémoire manuelle.

Certains bogues peuvent être évités lorsque la méthode de récupération de place est utilisée. Tel que:

  • problème de pointeur pendant dans lequel la mémoire pointée est déjà désallouée alors que le pointeur reste et pointe vers différentes données réaffectées ou mémoire déjà supprimée
  • le problème qui se produit lorsque nous essayons de supprimer ou de désallouer une deuxième fois la mémoire qui a déjà été supprimée ou réaffectée à un autre objet
  • supprime les problèmes ou bogues associés aux structures de données et gère efficacement la mémoire et les données
  • les fuites de mémoire ou les problèmes d'épuisement de la mémoire peuvent être évités

Voyons une compréhension détaillée de la gestion manuelle de la mémoire par rapport à la récupération de place, des avantages, des inconvénients et de la façon dont elle est implémentée en C ++.

Gestion manuelle de la mémoire

La mémoire allouée dynamiquement pendant l'exécution à partir du tas doit être libérée une fois que nous cessons d'utiliser cette mémoire. La mémoire allouée dynamiquement prend la mémoire du tas, qui est une mémoire libre.

En C ++, cette allocation de mémoire et cette désallocation se font manuellement à l'aide de commandes comme new, delete. L'utilisation de la «nouvelle» mémoire est allouée à partir du tas. Après son utilisation, cette mémoire doit être effacée à l'aide de la commande «supprimer».

Chaque allocation de mémoire avec «nouveau» doit être terminée avec une commande «supprimer». Sinon, nous allons perdre la mémoire.

Pour le montrer clairement avec un exemple:

n = nouvel échantillon_objet;
******* l'utilisation est implémentée ici *******
supprimer n;

Comme indiqué, chaque nouveau doit se terminer ou s'incliner avec une commande de suppression. Ici, n pointeur se voit allouer de la mémoire à l'aide de la commande 'new' et est référencé ou pointé vers un objet appelé 'sample_object'. Une fois l'utilisation et le fonctionnement du pointeur terminés, nous devons libérer ou libérer la mémoire à l'aide de la commande «supprimer», comme indiqué ci-dessus.

Mais en cas de garbage collection, la mémoire est allouée à l'aide de la commande 'new' mais elle n'a pas besoin d'être libérée manuellement à l'aide de 'delete'. Dans de tels cas, le garbage collector s'exécute périodiquement pour vérifier la mémoire disponible. Lorsqu'un morceau de mémoire n'est pointé par aucun objet, il efface ou libère la mémoire, créant ainsi plus d'espace de mémoire libre.

Avantages et inconvénients de la gestion manuelle de la mémoire

Les avantages de la gestion manuelle de la mémoire sont que l'utilisateur aurait un contrôle total sur les opérations d'allocation et de désallocation et qu'il saurait également quand une nouvelle mémoire est allouée et quand elle est désallouée ou libérée. Mais dans le cas de la récupération de place, exactement à la même instance après l'utilisation, la mémoire ne sera pas libérée, elle sera libérée lorsqu'elle la rencontrera pendant l'opération périodique.

Dans le cas également de la gestion manuelle de la mémoire, le destructeur sera appelé au même moment que nous appelons la commande «supprimer». Mais en cas de garbage collector qui n'est pas implémenté.

Il y a quelques problèmes associés à l'utilisation de la gestion manuelle de la mémoire. Parfois, nous pourrions avoir tendance à doubler la mémoire occupée. Lorsque nous supprimons le pointeur ou la mémoire déjà supprimés, il est possible que le pointeur fasse référence à d'autres données et puisse être utilisé.

Un autre problème que nous avons dans la gestion manuelle de la mémoire est que si nous obtenons une exception lors de l'exécution ou de l'utilisation du nouveau pointeur alloué en mémoire, il sortira de la séquence de «nouveau» et «supprimer» et l'opération de libération ne sera pas effectué. En outre, il peut y avoir des problèmes de fuite de mémoire.

Avantages et inconvénients de Garbage Collector

Un inconvénient majeur de la récupération de place est le temps ou les cycles de processeur impliqués pour trouver la mémoire inutilisée et la supprimer, même si l'utilisateur sait quelle mémoire de pointeur peut être libérée et non utilisée. Un autre inconvénient est que nous ne connaîtrons pas l'heure à laquelle il sera supprimé ni le moment où le destructeur sera appelé.

Algorithme de collecte des ordures

Il existe de nombreux algorithmes de récupération de place tels que le comptage de références, la marque et le balayage, la copie, etc. Voyons un algorithme en détail pour une meilleure compréhension. Par exemple, lorsque nous voyons l'algorithme de comptage de références, chaque mémoire dynamique aura un comptage de références. Lorsqu'une référence est créée, le nombre de références augmente et chaque fois qu'une référence est supprimée, le nombre de références est décrémenté. Une fois que le compte de référence devient nul, cela montre que la mémoire n'est pas utilisée et peut être libérée.

Cet algorithme peut être implémenté en C ++ en utilisant un type de pointeur spécifique. Un type de pointeur spécifique doit être déclaré et cela peut être utilisé à des fins telles que le suivi de toutes les références créées, le suivi du nombre de références lorsque la référence est créée et supprimée. Un programme C ++ peut contenir à la fois la gestion manuelle de la mémoire et la récupération de place dans le même programme. Selon le besoin, le pointeur normal ou le pointeur de ramasse-miettes spécifique peut être utilisé.

Ainsi, pour résumer, le garbage collection est une méthode opposée à la gestion manuelle de la mémoire. Dans un garbage collector, la mémoire est libérée automatiquement en fonction d'une base de temps périodique ou en fonction de critères spécifiques qui indiquent si elle n'est plus utilisée. Les deux méthodes ont leurs propres avantages et inconvénients. Celui-ci peut être implémenté et utilisé en fonction de la complexité de la fonction, en fonction du langage utilisé et de sa portée.

Articles recommandés

Ceci est un guide de la récupération de place C ++. Nous discutons ici de la gestion manuelle de la mémoire et de l'algorithme de récupération de place ainsi que des avantages et des inconvénients. Vous pouvez également consulter nos autres articles suggérés pour en savoir plus -

  1. Constructeur et destructeur en Java
  2. Fonctions de chaîne C ++
  3. Destructeur en Java
  4. Applications de C ++ dans le monde réel
  5. Les 11 principales fonctionnalités et avantages de C ++