La récupération de place signifie simplement que vos objets alloués sont automatiquement libérés à un moment donné après qu’ils ne sont plus joignables.
Plus précisément, ils sont libérés lorsqu'ils deviennent inaccessibles pour le programme, car les objets référencés de manière circulaire ne seraient jamais libérés autrement.
Les pointeurs intelligents font simplement référence à toute structure qui se comporte comme un pointeur ordinaire, mais qui comporte des fonctionnalités supplémentaires. Ceux - ci incluent, mais ne sont pas limités à la désallocation, mais également à la copie sur écriture, aux contrôles liés, ...
Maintenant, comme vous l'avez dit, les pointeurs intelligents peuvent être utilisés pour implémenter une forme de récupération de place.
Mais le train de pensée va de la manière suivante:
- La collecte des ordures ménagères est une bonne chose, car c'est pratique et je dois m'occuper de moins de choses
- Par conséquent: je veux le ramassage des ordures dans ma langue
- Maintenant, comment obtenir GC dans ma langue?
Bien sûr, vous pouvez le concevoir comme ça depuis le début. C # a été conçu pour être récupéré, new
il ne reste donc que votre objet et il sera publié lorsque les références tomberont hors de portée. La façon dont cela est fait est à la charge du compilateur.
Mais en C ++, il n'y avait pas de récupération de place prévue. Si nous allouons un pointeur int* p = new int;
qui tombe en dehors de la portée, il p
est lui-même retiré de la pile, mais personne ne s'occupe de la mémoire allouée.
Désormais, les destructeurs déterministes sont la seule chose que vous ayez au départ . Lorsqu'un objet quitte l'étendue dans laquelle il a été créé, son destructeur est appelé. En combinaison avec des modèles et une surcharge d'opérateur, vous pouvez concevoir un objet wrapper qui se comporte comme un pointeur, mais utilise la fonctionnalité de destructeur pour nettoyer les ressources qui lui sont attachées (RAII). Vous appelez celui-ci un pointeur intelligent .
Tout cela est très spécifique à C ++: surcharge d’opérateur, modèles, destructeurs, ... Dans cette situation de langage particulière, vous avez développé des pointeurs intelligents pour vous fournir le GC souhaité.
Mais si vous concevez une langue avec GC dès le départ, il ne s'agit que d'un détail d'implémentation. Vous dites simplement que l'objet sera nettoyé et que le compilateur le fera pour vous.
Des pointeurs intelligents comme en C ++ ne seraient probablement même pas possibles dans des langages comme C #, qui n’ont aucune destruction déterministe (C # contourne cela en fournissant du sucre syntaxique permettant d’appeler a .Dispose()
sur certains objets). Les ressources non référencées seront finalement récupérées par le GC, mais on ne sait pas exactement quand cela se produira.
Et ceci, à son tour, peut permettre au GC de faire son travail plus efficacement. Intégré plus profondément dans le langage que les pointeurs intelligents, le GC GC .NET peut par exemple retarder des opérations de mémoire et les exécuter par blocs pour les rendre moins chères ou même déplacer la mémoire pour une efficacité accrue en fonction de la fréquence des objets sont consultés.