boost :: conteneur standard shared_ptr
-
02-07-2019 - |
Question
Supposons que j'ai une classe foo et que je souhaite utiliser std :: map pour stocker des données boost :: shared_ptrs, par exemple:
.class foo;
typedef boost::shared_ptr<foo> foo_sp;
typeded std::map<int, foo_sp> foo_sp_map;
foo_sp_map m;
Si j'ajoute un nouveau foo_sp à la carte mais que la clé utilisée existe déjà, l'entrée existante sera-t-elle supprimée? Par exemple:
foo_sp_map m;
void func1()
{
foo_sp p(new foo);
m[0] = p;
}
void func2()
{
foo_sp p2(new foo);
m[0] = p2;
}
Le pointeur d'origine (p) sera-t-il libéré s'il est remplacé par p2? Je suis sûr que ce sera le cas, mais j’ai pensé que cela valait la peine de demander / de partager.
La solution
Tout d’abord, le titre de votre question indique boost :: auto_ptr, mais vous voulez dire réellement boost :: shared_ptr
Et oui, le pointeur d'origine sera libéré (s'il n'y a plus de références partagées).
Autres conseils
Cela dépend de ce qui se passe dans votre ... section
Votre classe conteneur contient des copies d'instances de foo_sp, lorsque vous exécutez m [0] = p2;
la copie de p
qui était à l'origine dans cet endroit va hors de portée. À ce moment, il sera supprimé s'il n'y a pas d'autre référence à foo_sp .
Si la copie déclarée dans la deuxième ligne foo_sp p (new foo);
est toujours là, la mémoire ne sera pas libérée. L'entrée sera supprimée une fois que toutes les références à celle-ci auront été supprimées.
Puisque stackoverflow ne me permet pas de commenter, je vais juste répondre. : /
Je ne vois pas " p " hors du champ d'application, de sorte que l'objet désigné par celui-ci ne sera pas libéré. " p " va toujours pointer vers elle.