La collecte des ordures Bibliothèques en C++
Ce gratuits et commerciaux de collecte des ordures bibliothèques sont disponibles pour le C++, et quels sont les avantages et les inconvénients de chacun?
Je suis intéressé par des leçons durement de l'utilisation réelle sur le terrain, pas de marketing ou de promotion de blurb.
Il n'est pas nécessaire de donner des précisions sur l'habitude des échanges automatique de collecte des ordures, mais s'il vous plaît n'oubliez pas de mentionner les algorithmes utilisés (comptage de référence, la marque et le balayage, les différentiels, etc.) et résumez brièvement les conséquences.
- la Raison pour rouvrir: Au moment de la validation d'origine étaient le logiciel de recommandations qui n'ont pas encore interdit sur le. L'application des règles rétroactive est une mauvaise action, en particulier car il ya aussi la possibilité de marquer la question historique, et c'est ce que je suggère de le faire. J'ai donc marqué la question d'une réouverture.
- Voir managedcpp.sourceforge.net à l'aide de BoehmGC mais pour le C++ plus précisément à l'aide de C++11.
Vous devez vous connecter pour publier un commentaire.
J'ai utilisé le Boehm collector dans le passé avec succès. Il est open source et peut être utilisé dans les logiciels commerciaux.
C'est un conservateur collecteur, et a une longue histoire de développement par l'un des chercheurs les plus réputés dans la collecte des ordures de la technologie.
Boost a une grande gamme de pointeurs intelligents qui impliment de comptage de référence ou supprimez-sur-le-champ à la sortie ou intrusif de comptage de référence. Celles-ci ont révélé suffisant pour nos besoins. Un grand plus est qu'il est gratuit, open source, basé sur un modèle de C++. parce que c'est le comptage de référence, dans la plupart des cas, il est fortement déterministe lorsqu'un objet est détruit.
shared_ptr
est utile "déterministe". Un destructeur sur un objet local instance fonctionne de façon déterministe - nous savons qu'il s'exécute lorsque le bloc enfermant est sorti. Mais dans la même situation avec unshared_ptr
, tout ce que nous savons, c'est que le refcount a été décrémenté. Le point de l'ensemble deshared_ptr
est que nous ne savons pas si l'objet est encore nécessaire d'ailleurs, nous ne pouvons donc pas déterminer localement quand elle a été détruite. Si vous avez besoin d'un "descripteur de fichier" objet d'être fermé par la fois que vous quittez une certaine étendue, ne pas utiliser deshared_ptr
.unique_ptr
s ne sont pas bien pris en charge en c++03, nous voyons beaucoup plus de l'utilisation deshared_ptr
s que nous devrions. Chaque pointeur est un pointeur partagé n'améliore pas le code c++ de la qualité. Chaque pointeur est un pointeur intelligent améliore considérablement la qualité du code. Mais la durée de vie de chaque objet complexe doit être motivé sur. La plupart des GC avais de code (C#,Java,etc) pourrait être améliorée par un développeur de raisonnement sur instance de la durée de vie. GC avais langues vous permettent d'ignorer la mémoire à vie les problèmes, mais d'autres ressources, les classes toujours besoin de considération.L'Boehm garbage collector est disponible gratuitement, et soi-disant plutôt bonne (pas de première main l'expérience moi-même)
([PDF AVERTISSEMENT]papier Théorique sur C++0x proposition de Boehm garbage collector)
Il a été dit de faire de C++0x mais ne va pas le faire après tout (en raison de contraintes de temps, je suppose).
Proprosal N2670 (un minimum de soutien pour les ramasseurs d'ordures) a approuvé, en juin 2008, cependant, de sorte que le compilateur implémentations ramasser sur ce, et la norme soit finalisé, la collecte des ordures monde pour le C++ est sûr de changer...
- Je utiliser boehm-gc beaucoup. Il est simple à utiliser, mais la documentation est vraiment pauvre. Il y a une page C++, mais son assez difficile à trouver.
Fondamentalement, assurez-vous simplement que chaque classe hérite de sa classe de base, et que tu passes toujours gc_allocator à un conteneur. Dans un certain nombre de cas, vous souhaitez utiliser libgccpp pour attraper d'autres utilisations de new et delete. Ces sont en grande partie des changements de haut niveau, et nous constatons que nous pouvons désactiver la GC au moment de la compilation à l'aide d'un #ifdef, et que le soutien de ceci affecte seulement un ou deux fichiers.
Mon problème majeur c'est que vous ne pouvez plus utiliser Valgrind, à moins que vous tournez le collecteur d'abord. Tout en tournant le collecteur off est facile à faire et ne nécessite pas de recompilation, il est évidemment impossible de l'utiliser si vous commencez à manquer de mémoire.
Le seul que je connaisse est Boehm, qui au fond est une marque traditionnelle et de balayage. Probablement qu'elle utilise différentes techniques pour optimiser cela, mais généralement progressive et générationnelle/compactage GC va être difficile de créer, pour le C++ sans passer pour un gérés sous-ensemble tel que ce que vous pouvez obtenir avec .Net C++. Certaines des approches qui doit déplacer les pointeurs peuvent être mises en œuvre avec prise en charge du compilateur pour l'épinglage de pointeurs ou de lire/écrire les blocs, mais l'effet sur les performances peut être trop grand, et il n'est pas nécessairement non négligeable des modifications à la GC.
La difficulté majeure avec les GC en C++ est la nécessité de gérer non coopératifs modules, dans la GC sens. c'est à dire, pour traiter avec les bibliothèques qui n'ont jamais été écrites avec les GC à l'esprit.
C'est pourquoi la GC de Boehm est souvent suggéré.
Voici un produit commercial que j'ai trouvé dans juste à la recherche de la même chose
HnxGC http://hnxgc.harnixworld.com/
Retour dans la journée, il y avait également un produit appelé Grand Cercle de Systèmes Géodésiques, mais n'a pas l'air comme ils le vendent plus. Aucune idée de si la a vendu le produit à n'importe qui d'autre.
Vous pouvez également utiliser Microsoft Managed C++. Le CLR et la GC sont très solides et utilisé dans des produits de serveur, mais vous devez utiliser les types CLR pour le GC de la collecte - vous ne pouvez pas simplement recompiler votre code existant et de supprimer toutes les instructions de suppression.
Je préfère utiliser le C# à écrire de marque nouveau code, mais le C++ permet de faire évoluer votre base de code de manière plus progressive.
Lire cette et de prendre un bon coup d'oeil à l'conclusions:
Oui, la dernière phrase est subjective et aussi une partie des guerres saintes.
J'utilise C++ parce que je n'aime pas l'idée que quelqu'un a besoin de sortir la poubelle pour moi.
L'hôtel de ville le fait, et c'est assez pour moi.
Si vous avez besoin d'GC utiliser une autre langue. Choisir le bon outil pour le bon travail.