Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Suppression d'un shared_ptr dans un vector

1 réponse
Avatar
DELVA Michael
Bonjour à tous,

struct toto
{
int i_;
toto(int i)
: i_(i)
{
std::cout << "Construction de toto avec i_= " << i_ << std::endl;
}

~toto()
{
std::cout << "Destruction de toto avec i_= " << i_ << std::endl;
}
};

std::vector<boost::shared_ptr<toto> > v;
typedef std::vector<boost::shared_ptr<toto> >::iterator Ite;

boost::shared_ptr<toto> selected;

int main(int argc, char* argv[])
{
boost::shared_ptr<toto> t1(new toto(1));
boost::shared_ptr<toto> t2(new toto(2));

selected = t1;

v.push_back(t1);
v.push_back(t2);

Ite ite = std::find(v.begin(),v.end(),selected);

assert(ite != v.end());

(*ite).reset(); //ICI EST LE PROBLEME
v.erase(ite);

return 0;
}

Comment je peux faire pour supprimer correctement l'élément du vecteur?

Ou bien est-ce que le shared_ptr me protège comme il faut, et je dois
juste appeler v.erase(ite)?

Merci d'avance

Michael

1 réponse

Avatar
alex
bonjour,

(*ite).reset(); //ICI EST LE PROBLEME


quel est le problème ?

v.erase(ite);

Comment je peux faire pour supprimer correctement l'élément du vecteur?


v.erase(ite) supprime l'élément du vecteur, et donc appelle son destructeur.
L'élément étant un shared_ptr il libère la mémoire allouée si celle-ci n'est
plus utilisée par d'autres copies


Ou bien est-ce que le shared_ptr me protège comme il faut, et je dois
juste appeler v.erase(ite)?


exact. C'est l'interet du shared_ptr.


Merci d'avance

Michael