c++ - enable_shared_from_this(c++0x): what am I doing wrong?

标签 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 吗?但是我怎么能事先知道呢?

最佳答案

使用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/

相关文章:

python - 从 python 调用 C++ 函数并获取返回值

c++ - 如何对可变参数函数中的所有参数调用 std::forward ?

MSVC 中的 C++ 自定义 STL 分配器错误?

C++函数头匹配: how does matching work when const and templates are both involved?

c++ - 为什么我不能将shared_from_this 与回调接口(interface)对象一起使用?

dll - 在 DLL 接口(interface)中使用 boost::shared ptr 可以吗?

c++ - 首次运行后倒数功能无法正常工作

c++ - 您可以在编译时将 __func__ 转换为 wchar_t[] 吗?

c++ - CMake 中的函数(重新)定义

c++ - std::sort 算法内存使用情况