2011-06-17 7 views
5

Possible en double:
How to implement garbage collection in C++Comment mettre en œuvre un Garbage Collector en C++

On m'a récemment posé cette question dans une interview sur la façon de mettre en œuvre un éboueur en C++.

Ma réponse était d'avoir un pool de mémoire pré-alloué et un objet de construction dans cet espace alloué. Également pour stocker la taille de la mémoire allouée à un objet dans l'octet précédant l'emplacement de mémoire sur lequel pointe le pointeur.

L'intervieweur n'était pas satisfait de la réponse.

J'ai réalisé plus tard que ma solution essayait en fait d'éviter l'objectif principal de garbage collector en préallouant un pool de mémoire et en travaillant avec cette mémoire.

Mais je pense qu'il serait difficile d'implémenter un garbage collector en C++ sans avoir à modifier le compilateur.

Des suggestions? Merci d'avance !!!

EDIT Il semble que quelqu'un d'autre aussi est venu face au même problème et beaucoup de gars intellos ont perdu leurs vues here

+2

Il y a une correspondance exacte pour votre requête ici: http://stackoverflow.com/questions/5009869/how-to-implement- garbage-collection-in-c Espérons que cela aide – Dennis

+1

Implémentez un garbage collector * dans * C++, ou implémentez un garbage collector * pour * C++? Si vous avez écrit votre JVM, et que le langage que vous avez utilisé pour l'écrire est C++, alors vous implémentez votre garbage collector Java en C++ plus ou moins de la même façon que vous implémentez un garbage collector Java dans n'importe quelle langue; –

+0

Je voulais dire GC pour C++ en C++ –

Répondre

2

Vous pouvez lire à propos de la structure shared_ptr.

Il implémente un simple reference-counting garbage collector.

Si vous voulez un vrai garbage collector, vous pouvez surcharger l'opérateur .

Créez une structure similaire à shared_ptr, appelez-la Object.

Cela va encapsuler le nouvel objet créé. Maintenant, avec la surcharge de ses opérateurs, vous pouvez contrôler le GC.

Tout ce que vous devez faire maintenant, est de mettre en œuvre juste un des nombreux GC algorithms

+0

Et assurez-vous que l'utilisateur n'autorise pas un pointeur brut à "échapper" le code qui contient un objet, de même que les utilisateurs de 'shared_ptr' à. Notez que le collecteur Boehm est plus intelligent que cela, il utilise une analyse de pile et d'objet spécifique à l'implémentation pour marquer/balayer les pointeurs bruts plutôt que seulement des objets spéciaux. –

+0

surcharger le nouvel opérateur est ce que font les pools de mémoire en C++. Aussi je me demande de réaliser le comptage des références en C++? –

2

Je pense que l'intervieweur cherchait des pointeurs intelligents comme c'est le meilleur de la langue peut faire et même alors, cela nécessite une certaine quantité d'attention de la part du programmeur. Ce n'est pas correct GC dans le sens CS.

+0

Oui, pour implémenter un GC pour C++ sur les lignes de JAVA GC nécessiterait une modification du compilateur. Donc, les pointeurs intelligents sont définitivement un moyen. Mais n'est-ce pas correct de dire que les pointeurs intelligents ne font rien de plus que les pools de mémoire en utilisant le placement nouveau, en fait les deux sont en fait les mêmes ??? –

+0

@Amm: non, car les pointeurs intelligents font plus que cela.En particulier, ce qui les rend intéressants, c'est qu'ils * libèrent * automatiquement la mémoire gérée par eux. – jalf