我只是想在即将到来的新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/