我只是想在即将到来的新c++标准中使用智能指针。但是,我无法掌握shared_from_this函数的用法。这是我所拥有的:

#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();
}

并在该行中引发std::bad_weak_ptr异常
std::shared_ptr<CVerboseBornAndDie2> p = vbad->shared_from_this();

如果我改为
std::shared_ptr<CVerboseBornAndDie2> p(vbad);

它可以工作,之后我可以做
std::shared_ptr<CVerboseBornAndDie2> p2 = p.get()->shared_from_this();

所以在我可以使用shared_from_this之前,该对象必须属于一个shared_ptr吗?但是我怎么能事先知道呢?

最佳答案

使用shared_from_this的前提是必须至少存在一个拥有所讨论对象的shared_ptr。这意味着您只能使用shared_from_this检索拥有您拥有引用或指针的对象的shared_ptr,而不能使用它来查找此类对象是否由shared_ptr拥有。

您需要重新设计,以确保您可以通过shared_ptr管理任何此类对象,或者您无需知道这些对象,或者最终(并且最不希望地)创建了某种其他方式来管理此知识。

关于c++ - enable_shared_from_this(c++ 0x): what am I doing wrong?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4428023/

10-11 19:31