Bha*_*ura 5 c++ boost shared-ptr c++11
我是C++ 11的新手,我遇到了enable_shared_from_this.我不明白它想要达到的目的是什么?所以我有一个使用enable_shared_from_this的程序.
struct TestCase: enable_shared_from_this<TestCase>
{
std::shared_ptr<testcase> getptr() {
return shared_from_this();
}
~TestCase() { std::cout << "TestCase::~TestCase()"; }
};
int main()
{
std::shared_ptr<testcase> obj1(new TestCase);
std::shared_ptr<testcase> obj2 = obj1->getptr();
// The above can be re written as below
// std::shared_ptr<testcase> obj2 = shared_ptr<testcase>(obj1);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是当我需要一个指向'this'的指针时,为什么不使用obj本身.为什么要从该类的函数返回'this',比如使用getptr()然后返回shared_from_this()???? 我不明白.
第二个问题,如果不使用enable_shared_from_this,为什么dtor被调用两次会产生问题,崩溃!!!!
我可以绕过使用enable_shared_from_this的另一种方法是这样的.在TestCase类中添加它
std::shared_ptr getptr1(shared_ptr obj) {
return std::shared_ptr(obj);
}
Run Code Online (Sandbox Code Playgroud)
从主要打电话给这个:
std::shared_ptr bp2 = bp1->getptr1(bp1);
Run Code Online (Sandbox Code Playgroud)
并做了.我们不需要enable_shared_from_this.为什么在地球上我们需要它?
A shared_ptr管理着两件不同的事情.它有一个指向其数据的指针,以及一个指向引用计数块的指针.
引用计数块具有强计数器,弱计数器和破坏操作.
当你std::shared_ptr<X>(pX),它创建一个新的引用计数块,当最后一个(强)引用消失时,它会删除该pX对象.
当你发生同样的事情std::shared_ptr<X>(this).
因此,如果将对象包装std::shared_ptr在两个不同的位置,则必须使用不同的引用计数块,并且它们都希望在对象消失时将其销毁.
enable_shared_from_this<X>改变这是如何工作的.当您创建一个指向从它继承的对象的共享指针时,它会std::weak_ptr<X>在其中存储一个enable_shared_from_this<X>.弱指针存储指向上述引用计数块的指针,但仅"保持"弱引用(不是强引用).
然后,当你调用时shared_from_this(),它.lock()在那个弱指针上执行一个操作,并使用创建的旧指针的引用计数块返回一个共享指针(由存储weak_ptr).
现在,上面是它可以做什么的示例实现:标准要求行为,而不是实现,并且weak_ptr是实现它的可能方式.类似地,引用计数块细节仅是示例实现.
核心问题是包装相同指针的两个独立共享指针将尝试独立管理指针的生命周期. enable_shared_from_this使第一个智能指针的引用计数块被后来的shared_from_this()返回值使用.
小智 5
简短回答:enable_shared_from_this当您需要在对象本身内部使用现有的共享指针保护this对象时,您需要。
在对象之外,您可以简单地分配和复制 a,shared_ptr因为您shared_ptr按原样处理变量。但是,当您在类成员之一中时,如果您需要使用指向 self 对象(而不是普通对象this)的共享指针,并且该方法的参数中没有这样的共享指针,那么shared_from_this()这将对您有所帮助。使用std::make_shared(this)是绝对不安全的,因为在同一个对象上不能有两个共享指针。虽然,shared_from_this()是安全的,因为它用于weak_ptr“解析”已经存在的shared_ptr.
为了能够使用shared_from_this()你必须首先enable_shared_from_this在你的类定义中使用它shared_from_this()向你的类添加一个方法。
注意,shared_from_this()不能在类构造函数中使用!当时shared_ptr还不存在,因此shared_from_this()无法解析任何现有的指针。
什么时候以及为什么需要一个共享的指针,this而不是仅仅this是另一个问题。例如,它在异步编程中被广泛用于回调绑定。