Ich bin nur mit den intelligenten Zeigern in der bevorstehenden neuen C++ Standard herumspielen. Allerdings verstehe ich die Verwendung der Funktion shared_from_this nicht. Hier ist, was ich habe:enable_shared_from_this (C++ 0x): Was mache ich falsch?
#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);
es funktioniert und ich kann danach tun
std::shared_ptr<CVerboseBornAndDie2> p2 = p.get()->shared_from_this();
so muss das Objekt zu einem shared_ptr gehören, bevor ich shared_from_this verwenden kann? Aber wie kann ich das vorher wissen?
Konnten Sie nicht einfach einen try-Block um einen Aufruf von shared_from_this setzen, wenn Sie herausfinden wollten, ob das Objekt von einem shared_ptr gehalten wird? Ich weiß nicht, wie es im (kommenden) Standard spezifiziert ist, aber es scheint kein undefiniertes Verhalten zu sein - es wirft eine Ausnahme auf. – nobar
@nobar: Dies wäre inferently unsicher. Sie würden sich auf undokumentierte Implementierungsdetails verlassen. 'shared_from_this' ist keine Methode zum Testen, ob ein Objekt einem gemeinsamen Zeiger gehört; es ist eine Methode zum Abrufen eines geteilten Zeigers von einem Objekt, dem Sie _know_ im Besitz eines gemeinsamen Zeigers sind. –
Ich denke, du hast Recht. Der C++ 0x-Entwurf besagt: "Es muss mindestens eine shared_ptr-Instanz geben, die & t. Besitzt." Sie sagt jedoch nicht, was sonst passiert. Es zeigt eine Implementierung in Bezug auf weak_ptr (was bedeuten würde, dass eine Exception bei einem Fehler ausgelöst wird), aber das ist nur ein "Vorschlag". Ich frage mich, ob die Fehlerbehandlung eventuell besser spezifiziert wird. – nobar