2014-09-25 3 views
5

Ich lerne über C++ 11 Funktionen, speziell shared_ptr, und ich habe ein Problem mit Bezug auf this und verwenden Sie es als Referenz für andere Klassen.Mit "this" als shared_ptr?

Der Grund dafür ist, dass ich eine Simulation Instanz habe, die an andere Instanzen innerhalb der Simulation weitergegeben wird (z. B. Apple), so dass sie die Simulation selbst modifizieren oder sogar selbst aus der Simulation entfernen können.

In meinem komplexeren Code bekomme ich einen double free Fehler (wenn das Programm existiert), die wie ich from here verstehe, dass ich keine shared_ptr zweimal auf dem gleichen rohen Objekt erstellen sollte. Wie übergebe ich this an das Apple Objekt als shared_ptr, wenn die Simulationsklasse nicht weiß, dass this bereits ein shared_ptr ist?

Mein Gedanke ist, die shared_ptr in der Initialisierung Argumente übergeben, aber das scheint überflüssig, z.B .:

// The argument is a std::shared_ptr<Simulation> 
simulation->initSomethingElse(simulation); 

Vielleicht mein Verständnis ist, ich versuche, dies in einem ungewöhnlichen Muster zu implementieren, oder vielleicht auch nicht ganz richtig? Vielleicht gibt es dafür einen schöneren Weg?

Ich habe ein vereinfachtes Beispiel unter:

#include <memory> 

class Simulation; 

class Apple { 
public: 
    void init(std::shared_ptr<Simulation> simulation) { 
     this->simulation = simulation; 
    }; 

private: 
    std::shared_ptr<Simulation> simulation; 

}; 


class Simulation { 
public: 
    void initSomethingElse() { 
     auto apple = std::shared_ptr<Apple>(new Apple()); 

     // incorrect second reference to the raw pointer 
     apple->init(std::shared_ptr<Simulation>(this)); 
    }; 
}; 


int main() { 

    auto simulation = std::shared_ptr<Simulation>(new Simulation()); 
    simulation->initSomethingElse(); 

    return 0; 
} 
+0

Wo zerstören Sie die 'shared_ptr ' Instanzen? – Dai

Antwort

8

Das erste, was in den Sinn kommt, ist enable_shared_from_this zu verwenden: http://en.cppreference.com/w/cpp/memory/enable_shared_from_this

Aber die zweite Sache, die den Sinn kommt, ist, dass die Simulation soll die Lebensdauer des Apple verwalten werden, so das Apple verwalten müssen nicht die Lebensdauer der Simulation. Daher sind Sie besser dran, dass der Apple nicht halten shared_ptr<Simulation> - nur main() oder einige High-Level-Funktion sollte die Lebensdauer der Simulation verwalten.

Wenn Sie nicht vorsichtig sind, werden Sie mit zyklischen Referenzen enden. Gehen Sie nicht davon aus, dass jeder Zeiger in C++ 11 ein shared_ptr sein sollte.

+0

+1 für den letzten Satz allein – James

1

Verwenden enable_shared_from_this so eine Funktion auf dem Objekt ein neues shared_ptr sich erstellen können. Sie möchten dies anstelle der apple->init(std::shared_ptr<Simulation>(this)); Zeile, die eine zweite shared_ptr an die Simulation erstellt. Sie wollen auch die appleshared_ptr irgendwo rrurn oder speichern, wie zur Zeit die Apple nur existiert, während initSomethingElse() läuft, die nicht sehr nützlich scheint ...?