faible ptr, faire partagé et désallocation de la mémoire

Un bloc de contrôle d'un shared_ptr est maintenu en vie tant qu'il y en a au moins un weak_ptr présent. Si le pointeur partagé a été créé avec make_shared cela implique que toute la mémoire de l'objet est conservée affectée. (L'objet lui-même est correctement détruit, mais puisque le bloc de contrôle et la mémoire de l'objet ont été alloués en un seul morceau, comme make_shared ne peuvent être désalloqués qu'ensemble.)

ma compréhension est-elle correcte?

Il semble que ce comportement représente un problème, par exemple dans le célèbre "cache"exemple. La mémoire des objets sera conservée à jamais.

C'est un problème dans toutes les situations pratiques? Le shared_ptr être créé en utilisant un constructeur dans une telle situation (grand objet et intention d'utiliser weak_ptr s)?

18
demandé sur curiousguy 2015-08-20 11:45:36
la source

2 ответов

ma compréhension est-elle correcte?

Oui. Si votre weak_ptr s survivent de manière significative à l'objet (grand) et vous êtes serré sur la mémoire, il peut être bénéfique d'éviter make_shared.

Toutefois, le "grand" ici est mesurée par sizeof, et de nombreux objets conceptuellement "grands" (par exemple, la plupart des conteneurs standard, sauf std::array) sont assez petites par cette mesure, parce qu'ils allouer de la mémoire supplémentaire pour stocker leur contenu, qui sera libéré dès que le l'objet est détruit.

11
répondu T.C. 2015-08-20 12:23:48
la source

j'ai essayé cela en VS2013 et vous avez tout à fait raison. Le destructeur est appelé lorsque le dernier shared_ptr est détruit, de sorte que tout autre objet ou mémoire associé à l'objet sera détruit, mais si le shared_ptr est créé avec make_shared la mémoire n'est jamais détruite jusqu'à ce que le dernier weak_ptr soit.

je pense qu'il est toujours bon de nettoyer ou de réinitialiser votre weak_ptrs si lock() échoue parce que même sans make_shared il utilise encore de la mémoire.

2
répondu Dave Emberton 2015-08-20 12:38:54
la source

Autres questions sur c++ c++11 shared-ptr weak-ptr make-shared