2017-07-20 5 views
0

Der folgende Code verursacht eine std::bad_weak_ptr Ausnahme, wenn der Ctor für MyCommand ausführt, aber nicht die Funktion MyCommand::execute.std :: bad_weak_ptr Ausnahme bei Verwendung von shared_from_this

class Observer 
{ 
public: 
    Observer(){} 
    virtual ~Observer(){} 

    virtual void update(const std::string& msg) = 0; 
}; 

class Command 
{ 
public: 
    Command(){} 
    virtual ~Command(){} 

    virtual void execute() = 0; 
}; 

class MyCommand : public Command, public Observer, public std::enable_shared_from_this<MyCommand> 
{ 
public: 
    MyCommand() 
    { 
     // std::bad_weak_ptr exception 
     std::shared_ptr<Observer> observer = shared_from_this(); 
    } 

    virtual ~MyCommand(){} 

private: 
    virtual void execute() 
    { 
     // no exception 
     std::shared_ptr<Observer> observer = shared_from_this(); 
    } 
    virtual void update(const std::string& msg){} 
}; 

int main(int argc, const char* argv[]) 
{ 
    // causes std::bad_weak_ptr exception 
    std::shared_ptr<Command> myCommand = std::make_shared<MyCommand>(); 

    // doesn't cause std::bad_weak_ptr exception 
    myCommand->execute(); 
} 

auf enable_shared_from_this Lesen, ich weiß, dass:

Prior shared_from_this auf einem Objekt t zu nennen, muss es ein std :: shared_ptr sein, die t besitzt.

Ich muß verstehen, warum die Ausnahme in dem Ctor geworfen wird, aber nicht in der execute Funktion.

Ist etwas damit zu tun, dass der ctor nicht vollständig ausgeführt wurde, bevor shared_from_this aufgerufen wird und daher das Objekt nicht vollständig aufgebaut ist?

Wenn nicht, was ist das?

+0

Wie schaffen Sie es, zur Anruffunktion zu kommen, wenn der Bauleiter wirft? – doctorlove

+0

@doctorlove Ich habe den Inhalt des ctor auskommentiert. – ksl

+0

Mögliches Duplikat von [Warum shared \ _from \ _this kann vom technischen Standpunkt aus nicht im Konstruktor verwendet werden?] (Https://stackoverflow.com/questions/31924396/why-shared-from-this-cant-be-used- In-Konstruktor-von-technischen-Standpunkt) – Holt

Antwort

Verwandte Themen