fsc*_*itt 9 c++ smart-pointers shared-ptr c++11
我只是在即将推出的新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吗?但我怎么能事先知道呢?
CB *_*ley 22
使用shared_from_this必须存在至少一个shared_ptr拥有相关对象的前提条件.这意味着您只能用于shared_from_this检索shared_ptr拥有您具有引用或指针的对象,您无法使用它来查明此对象是否归a所有shared_ptr.
您需要重新设计您的设计,以确保您确保任何此类对象由shared_ptr您或您不需要知道或最终(并且最不希望)您创建管理此知识的其他方式来管理.
ron*_*nag 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.
};
| 归档时间: | 
 | 
| 查看次数: | 6100 次 | 
| 最近记录: |