Come evitare la perdita di memoria con shared_ptr?
-
11-09-2019 - |
Domanda
Si consideri il seguente codice.
using boost::shared_ptr;
struct B;
struct A{
~A() { std::cout << "~A" << std::endl; }
shared_ptr<B> b;
};
struct B {
~B() { std::cout << "~B" << std::endl; }
shared_ptr<A> a;
};
int main() {
shared_ptr<A> a (new A);
shared_ptr<B> b (new B);
a->b = b;
b->a = a;
return 0;
}
C'è nessun output. Non desctructor viene chiamato.Perdita di memoria.Ho sempre creduto che il puntatore intelligente consente di evitare perdite di memoria.
Cosa devo fare se ho bisogno di riferimenti incrociati durante le lezioni?
Soluzione
Se si dispone di riferimenti circolari come questo, un oggetto deve avere un weak_ptr
per gli altri, non shared_ptr
.
Da il shared_ptr
introduzione:
Perché l'implementazione utilizza il reference counting, cicli di
shared_ptr
le istanze non saranno recuperati.Per esempio, semain()
detiene unashared_ptr
perA
, che , direttamente o indirettamente,shared_ptr
torna allaA
,A
all'utilizzo da parte di conte sarà 2.Distruzione dell'originaleshared_ptr
lasciaA
penzoloni con un conteggio di utilizzo di 1.Utilizzareweak_ptr
per "rompere i cicli."
Grazie, Glen, per il collegamento.