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?

È stato utile?

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, se main() detiene una shared_ptr per A, che , direttamente o indirettamente, shared_ptr torna alla A, Aall'utilizzo da parte di conte sarà 2.Distruzione dell'originale shared_ptr lascia A penzoloni con un conteggio di utilizzo di 1.Utilizzare weak_ptr per "rompere i cicli."

Grazie, Glen, per il collegamento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top