Je suppose que je ne comprends pas complètement comment les destructeurs fonctionnent en C++. Voici l'exemple de programme je l'ai écrit pour recréer la question:C++: Pourquoi le destructeur est-il appelé ici?
#include <iostream>
#include <memory>
#include <vector>
using namespace std;
struct Odp
{
int id;
Odp(int id)
{
this->id = id;
}
~Odp()
{
cout << "Destructing Odp " << id << endl;
}
};
typedef vector<shared_ptr<Odp>> OdpVec;
bool findOdpWithID(int id, shared_ptr<Odp> shpoutOdp, OdpVec& vec)
{
shpoutOdp.reset();
for (OdpVec::iterator iter = vec.begin(); iter < vec.end(); iter++)
{
Odp& odp = *(iter->get());
if (odp.id == id)
{
shpoutOdp.reset(iter->get());
return true;
}
}
return false;
}
int main()
{
OdpVec vec;
vec.push_back(shared_ptr<Odp>(new Odp(0)));
vec.push_back(shared_ptr<Odp>(new Odp(1)));
vec.push_back(shared_ptr<Odp>(new Odp(2)));
shared_ptr<Odp> shOdp;
bool found = findOdpWithID(0, shOdp, vec);
found = findOdpWithID(1, shOdp, vec);
}
Juste avant main()
conclut, la sortie de ce programme est:
Destructing Odp 0
Destructing Odp 1
Pourquoi cela? Je conserve une référence à chacune des instances Odp
dans le vecteur. Cela a-t-il quelque chose à voir avec le passage d'un shared_ptr
par référence?
MISE À JOUR Je pensais que shared_ptr::reset
décrémenté le comte ref, basé sur MSDN:
Les opérateurs tous Decremente le compteur de référence pour la ressource actuellement détenue par * ce
mais peut-être que je le comprends mal?
MISE À JOUR 2: On dirait que cette version de findOdpWithID()
ne provoque pas la destructor à appeler:
bool findOdpWithID(int id, shared_ptr<Odp> shpoutOdp, OdpVec& vec)
{
for (OdpVec::iterator iter = vec.begin(); iter < vec.end(); iter++)
{
Odp& odp = *(iter->get());
if (odp.id == id)
{
shpoutOdp = *iter;
return true;
}
}
return false;
}
Vous mentionnez dans un commentaire ci-dessous que vous essayez de décrémenter le compteur. Vous ne devriez pas vous inquiéter à ce sujet. C'est le travail du pointeur partagé de s'inquiéter des détails d'implémentation comme le nombre de ref. Vous devriez juste l'utiliser. Vous pouvez penser à shared_ptr comme le pointeur java, il fait tout le travail dont vous avez besoin dans les coulisses. –
Ce n'est pas une bonne question. Vous faites allusion à un "problème" mais ne nous dites pas ce que c'est, et vous vous plaignez de la sortie de votre programme mais ne nous dites pas ce que vous attendiez à la place. Nous ne pouvons pas deviner le comportement que vous attendez dans votre esprit, d'autant plus que le comportement réel - étant, par nature, le bon comportement C++ - est ce que nous attendons! –