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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top