2009-01-21 6 views
6

Quels garbage collectors sont disponibles pour C++? Utilisez-vous l'un d'entre eux? Avec quels résultats?Quels garbage collectors sont disponibles pour C++?

+0

Il n'y a pas besoin d'un garbage collector dans le cas général car les pointeurs intelligents C++ sont supérieurs et donnent une destruction déterministe. Si vous avez un "cas d'utilisation" particulier pour la collecte des ordures alors peut-être que nous pourrions répondre à la question de façon plus réfléchie. –

+0

@Martin - votre commentaire ressemble à une réponse. Vous devriez l'afficher pour que les gens puissent voter correctement. – Aaron

+0

Boehm a fait une présentation pour le comité ISO C++ sur GC (2004 IIRC, lorsque les pointeurs intelligents étaient bien connus) donc il semble que l'opinion de Martins ne devrait pas être énoncée comme un fait. – MSalters

Répondre

6

La bibliothèque Boost inclut des éléments shared_ptr qui agissent essentiellement comme un garbage collector de comptage de référence. Si vous adoptez le principe RAII de la conception C++, cela et auto_ptr combleront vos besoins pour un "garbage collector".

+1

Pas si vous voulez pouvoir modéliser des références cycliques. –

+0

@DanielEarwicker: En fait, Boost contient aussi weak_ptr pour résoudre ce problème. –

+0

@JosephGarvin Vrai - mais alors vous devez choisir le bon. Avec un GC, vous n'avez pas (ce qui est ce que le PO a demandé à propos de). –

4

Le seul dont j'ai entendu personnellement est le Boehm garbage collector Je suis sûr que d'autres existent, mais je n'ai pas traité avec eux (ou cherché eux non plus).

5

Plusieurs GC C++ sont répertoriés on wikipedia.

Cependant, je n'en utilise pas, RAII est aussi mon ami.

5

Le garbage collector Boehm est plutôt bon pour C, mais difficile à utiliser sous C++. Vérifiez la section "interface C++" au http://www.hpl.hp.com/personal/Hans_Boehm/gc/gcinterface.html. Mon avis est que si vous avez besoin de garbage collection, choisissez un langage qui l'a intégré.

La meilleure solution générale pour C++ est des pointeurs partagés (de boost par exemple) avec vous traitant des dépendances circulaires. Il y a deux choses que vous pouvez faire: 1. la conception de la chose sans dépendances circulaires 2. conception de la chose avec une « cheville ouvrière » qui brise le cercle pour permettre la remise en état des objets

Soit vous faites affaire avec réel Mauvais, compliqué, difficile à déboguer des problèmes avec un garbage collector pour C++ ou vous faites face au problème classique plus simple de libérer vos objets lorsque vous en avez fini avec eux.

2

Il y a toujours, ahem: C++/CLI - C++ pour le .NET Framework. Assez bonne collecte des ordures là. : p

Bien que, pour être honnête, avec tout le sucre syntaxique qu'ils mettent là, vous pourriez presque le considérer comme un tout nouveau langage qui fonctionne assez bien avec C/C++. Si vous n'êtes pas marié à C++ en tant que langage, vous pouvez également regarder dans D, qui compile en code natif comme C++ (et contrairement à C++/CLI) mais qui a également la garbage collection.

2

Vous pouvez trouver plusieurs implémentations here. Je n'ai jamais essayé aucun d'entre eux et en général, je trouve un GC non déterministe causant plus de mal que de bien.

Questions connexes