enable_shared_from_this (c++0x): was mache ich falsch?
Ich bin nur spielte, um mit den smart-Pointer in der kommenden neuen c++ - standard. Aber ich kann das nicht begreifen, wird die Nutzung der shared_from_this Funktion. Hier ist, was ich habe:
#include <iostream>
#include <memory>
class CVerboseBornAndDie2 : public std::enable_shared_from_this<CVerboseBornAndDie2>
{
public:
std::string m_Name;
CVerboseBornAndDie2(std::string name) : m_Name(name)
{
std::cout << m_Name << " (" << this << ") is born!" << std::endl;
}
virtual ~CVerboseBornAndDie2()
{
std::cout << m_Name << " (" << this << ") is dying!" << std::endl;
}
};
int main(){
CVerboseBornAndDie2* vbad = new CVerboseBornAndDie2("foo");
std::shared_ptr<CVerboseBornAndDie2> p = vbad->shared_from_this();
}
und es wirft eine std::bad_weak_ptr Ausnahme in der Linie
std::shared_ptr<CVerboseBornAndDie2> p = vbad->shared_from_this();
wenn ich stattdessen tun
std::shared_ptr<CVerboseBornAndDie2> p(vbad);
funktioniert es und ich kann Sie danach tun
std::shared_ptr<CVerboseBornAndDie2> p2 = p.get()->shared_from_this();
so muss das Objekt gehört zu einem shared_ptr, bevor ich Sie verwenden kann shared_from_this? Aber Woher weiß ich das vorher?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist eine Voraussetzung für die Verwendung
shared_from_this
müssen, dass es existiert mindestens einshared_ptr
besitzt, die das Objekt in Frage. Dies bedeutet, dass Sie nur verwenden könnenshared_from_this
zum abrufen einershared_ptr
dass ein Objekt besitzt, auf die Sie eine Referenz oder ein Zeiger, können Sie es verwenden, um herauszufinden, ob solch ein Objekt ist im Besitz einesshared_ptr
.Müssen Sie Bearbeiten Sie Ihre design, so dass Sie garantiert, dass jedes solche Objekt wird verwaltet durch einen
shared_ptr
oder, dass Sie nicht immer wissen müssen, oder schließlich (und am wenigsten wünschenswert) erstellen Sie einige andere Art der Verwaltung dieses Wissens.shared_from_this
ist nicht eine Methode, um zu testen, ob ein Objekt ist im Besitz eines shared pointer; es ist eine Methode für das abrufen ein shared-pointer von einem Objekt, dass Sie wissen ist im Besitz von einem shared pointer.Erweitern Charles Antwort, wenn Sie
enable_shared_from_this
Sie wollen in der Regel etwas wie folgt vor, um zu gewährleisten, dass es einen shared_ptr.create()
solltestatic
, nicht wahr?try { return shared_from_this(); } catch (const bad_weak_ptr&) { return make_shared<C>(); }