enable_shared_from_this(c ++ 0x):我做错了什么?

时间:2010-12-13 10:48:39

标签: c++ c++11 shared-ptr smart-pointers

我只是在即将推出的新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吗?但我怎么能事先知道呢?

2 个答案:

答案 0 :(得分:22)

使用shared_from_this的先决条件是必须存在至少一个拥有相关对象的shared_ptr。这意味着您只能使用shared_from_this来检索拥有您具有引用或指针的对象的shared_ptr,您无法使用它来查明此类对象是否归{{{0}所有。 1}}。

您需要重新设计您的设计,以便保证任何此类对象由shared_ptr管理,或者您不需要知道或最终(并且最不希望)您创建其他对象管理这种知识的方式。

答案 1 :(得分:15)

要扩展Charles答案,当您使用enable_shared_from_this时,您通常需要类似下面的内容,以确保存在shared_ptr。

class my_class : public std::enable_shared_from_this<my_class>
{
public:
    static std::shared_ptr<my_class> create() // can only be created as shared_ptr
    {
         return std::shared_ptr<my_class>(new my_class());
    }
private
    my_class(){} // don't allow non shared_ptr instances.
};