因为 std::shared_ptr 内部是基于引用计数来实现的, 当引用计数为 0 时,就会释放内部持有的裸指针。但是当 a 持有 b, b 也持有 a 时,相当于 a 和 b 的引用计数都至少为 1,因此得不到释放,RAII 此时也无能为力。这时就需要使用 weak_ptr 来打破循环引用。
c++ 使用shared_from_this时出现“std::bad_weak_ptr”错误为了初始化enable_shared_from_this子对象...
问使用std::bad_weak_ptr时的shared_from_this异常EN您不能在构造函数中使用shared_from_this,因为还...
#include <memory> // 情况1:在构造函数中使用shared_from_this class Case1 : public std::enable_shared_from_this<Case1>{ public: Case1(){ // 抛异常:terminating due to uncaught exception of type std::__1::bad_weak_ptr: bad_weak_ptr auto case1 = shared_from_this(); } }; // 情...
还有其他方法可以做到这一点,例如通过使用比较函数搜索std::set使用一个shared_ptr和一个原始指针并知道比较它们指向的地址。你选择哪种方式并不重要,但你完全摆脱了shared_from_this()的情况。 原文由John Zwinck发布,翻译遵循 CC BY-SA 3.0 许可协议
~Bad() { std::cout << "Bad::~Bad() called" << std::endl; } }; int main() { // 错误的示例,每个shared_ptr都认为自己是对象仅有的所有者 std::shared_ptr<Bad> bp1(new Bad()); std::shared_ptr<Bad> bp2 = bp1->getptr(); ...
shared_from_this bad_weak_ptr的原因 原因:创建类A的对象的时候没有用智能指针包裹,而是直接new的裸指针。 enable_from_this 的使用与实现原理说明: shared_from_this()是enable_shared_from_this<T>的成员函数,返回shared_ptr<T>; 注意的是,这个函数仅在shared_ptr<T>的构造函数被调用之后才能使用。
如你所见,这里对__shared_ptr/__shared_count接受__weak_ptr/__weak_count的构造函数都进行了重载,有一个额外接受std::nothrow的版本和一个仅接受__weak_count。实际上,前者用于在用空的weak_ptr初始化shared_ptr时抛出bad_weak_ptr,而后者则用于当weak_ptr指向的对象无效时,在lock方法上返回空的shared_ptr。
我们在使用 C++ 的时候,有时会需要在类的内部获取自身的 shared_ptr,这就会用到std::enable_shared_from_this。在实际使用过程中,std::enable_shared_from_this有三个陷阱需要注意: 不能在构造函数中使用 shared_from_this(), 否则会抛出 std::bad_weak_ptr 异常。对应下面情况 1。
注意:当你想使用getSharedFromThis时,必须以智能指针构造,而非以raw指针形式。否则会报std::bad_weak_ptr的错 intmain() { autop=std::make_shared<obj>(); // auto p = new obj(); p->getSharedFromThis()->doSomething(); } 1. 2. ...