繁体   English   中英

尝试了解std :: enable_shared_from_this <T> 但导致bad_weak_ptr使用它

[英]Try to understand std::enable_shared_from_this<T> but cause a bad_weak_ptr using it

我试着理解std :: enable_shared_from_t这个类的行为,但我无法理解它。 所以我写了一个简单的程序来测试不同的情况。

有人可以解释一下下面代码的行为,因为我无法解释观察到的结果。

谢谢你的帮助。

#include <iostream>
#include <memory>

struct C : std::enable_shared_from_this<C> { };

int main () {
    {//test 1
    std::shared_ptr<C> foo, bar;
    foo = std::make_shared<C>();
    bar = foo->shared_from_this(); //ok
    std::cout<<"shared_ptr : ok"<<std::endl;
    }

    {//test 2
    std::shared_ptr<C> foo = std::shared_ptr<C>(new C);
    std::shared_ptr<C> bar;
    bar = foo->shared_from_this(); //ok
    std::cout<<"shared_ptr + New : ok"<<std::endl;
    }

    {//test 3
    C* foo = new C;
    std::shared_ptr<C> bar;
    bar = foo->shared_from_this(); //throw std::bad_weak_ptr
    std::cout<<"New : ok"<<std::endl;
    }

   {//test 4 (should make a invalid free of something like that)
    C foo;
    std::shared_ptr<C> bar;
    bar = foo.shared_from_this();//throw std::bad_weak_ptr
    std::cout<<"local : ok"<<std::endl;
   }

  return 0;
}

这是输出:

shared_ptr : ok
shared_ptr + New : ok
terminate called after throwing an instance of 'std::bad_weak_ptr'
   what():  bad_weak_ptr

建立信息

  • 系统:Windows 7 x64
  • 编译器:mingw 4.9.2 x64

对于合同enable_shared_from_this是,它会提供一个shared_ptr ,当你调用shared_from_this() 如果对象是由管理shared_ptr 如果尚未管理,则无法自行创建shared_ptr

你已经在最后一个测试案例中弄清楚为什么允许shared_from_this()为你创建一个共享指针是个坏主意...

如果我从原始的boost文档中正确记住,“必须存在至少一个拥有t的shared_ptr实例p”。 对于案例3和4,您没有调用shared_from_this()。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM