2017-01-31 3 views
0

In meinem Code, ich habeC++ Shared_ptr Reihenfolge der Veröffentlichung

void Test(){ 
    std::shared_ptr<A> a = std::shared_ptr<A>(new A()); 
    std::shared_ptr<B> b = std::shared_ptr<B>(new B(a->getSomething()); 
} 

Das Problem ist, dass a vor b freigegeben wird, aber während b Release Ich brauche etwas von a, dass über a->getSomethig() erhalten. Ich kann getSomething Methode nicht ändern.

Kann ich die Reihenfolge ändern, in der freigegebene Zeiger freigegeben werden?

+3

In dem Code hier, b Destruktor wird vor a genannt. Ich sehe das Problem nicht – Justin

+1

Können Sie dann eine MVCE teilen? Grundlegend Sharecode, der 'a' vor' b' zerstört hat, damit wir Ihr Problem besser verstehen können – Justin

+0

Halten Sie einen gemeinsamen Zeiger auf A in B –

Antwort

2

Angenommen, Sie haben die Reihenfolge der Objekte in der ursprünglichen Frage umgekehrt (andernfalls ist die Frage sinnlos), müssen Sie die Reihenfolge der Veröffentlichung nicht ändern, stattdessen sollten Sie die Alias-Form von shared_ptr-Konstruktor verwenden. Etwas wie das:

std::shared_ptr<B> b(a, a->getSomething()); 
+0

Ich dünnte, dass man Aliasing verwenden sollte egal was: Verlass auf die Reihenfolge der Deklarationen zerbrechlich und widerspricht dem Konzept der automatischen Verarbeitung von Ressourcen durch intelligente Zeiger. – curiousguy

Verwandte Themen