为了账号安全,请及时绑定邮箱和手机立即绑定

‘Enable_Shared_From_this’的有用性是什么?

/ 猿问

‘Enable_Shared_From_this’的有用性是什么?

C++
LEATH 2019-07-22 15:08:12

‘Enable_Shared_From_this’的有用性是什么?

我跑过去enable_shared_from_this在阅读Boost.Asio示例时,在阅读了文档之后,我仍然不知道该如何正确地使用它。请有人给我一个例子和/或解释什么时候使用这个类是有意义的。



查看完整描述

3 回答

?
幕布斯5086720

它使您能够获得有效的shared_ptr实例到this当你只有this..没有它,你就无法得到shared_ptrthis,除非你已经有了一个会员。此示例来自Boost文档,用于启用_Shared_from_this:

class Y: public enable_shared_from_this<Y>{public:

    shared_ptr<Y> f()
    {
        return shared_from_this();
    }}int main(){
    shared_ptr<Y> p(new Y);
    shared_ptr<Y> q = p->f();
    assert(p == q);
    assert(!(p < q || q < p)); // p and q must share ownership}

方法f()返回有效的shared_ptr尽管它没有成员实例。请注意,您不能简单地这样做:

class Y: public enable_shared_from_this<Y>{public:

    shared_ptr<Y> f()
    {
        return shared_ptr<Y>(this);
    }}

此返回的共享指针将具有与“适当的”引用计数不同的引用数,其中一个将在删除对象时丢失并保存一个悬空引用。

enable_shared_from_this已经成为C+11标准的一部分。你也可以从那里得到它,也可以从Boost那里得到它。


查看完整回答
反对 回复 2019-07-22
?
犯罪嫌疑人X

从Dobbs博士关于弱指针的文章中,我认为这个例子更容易理解(来源:http://drdobbs.com/cpp/184402026):

.这样的代码不能正常工作:

int *ip = new int;shared_ptr<int> sp1(ip);shared_ptr<int> sp2(ip);

两个人都没有shared_ptr对象知道另一个对象,因此当它们被销毁时,它们都会尝试释放资源。这通常会导致问题。

类似地,如果成员函数需要shared_ptr对象,它拥有正在调用的对象,它不能只是动态地创建一个对象:

struct S{
  shared_ptr<S> dangerous()
  {
     return shared_ptr<S>(this);   // don't do this!
  }};int main(){
   shared_ptr<S> sp1(new S);
   shared_ptr<S> sp2 = sp1->dangerous();
   return 0;}

此代码与前面的示例有相同的问题,尽管以更微妙的形式出现。构造时,shared_ptR对象sp1拥有新分配的资源。成员函数中的代码S::dangerous不知道shared_ptr对象,所以shared_ptr对象与它返回的对象是不同的。sp1..复制新的shared_ptr对象为sp2帮不上忙;什么时候sp2超出范围,它将释放资源,并且当sp1超出范围,它将再次释放资源。

避免此问题的方法是使用类模板。enable_shared_from_this..模板采用一个模板类型参数,它是定义托管资源的类的名称。相应地,该类必须公开地从模板派生;如下所示:

struct S : enable_shared_from_this<S>{
  shared_ptr<S> not_dangerous()
  {
    return shared_from_this();
  }};int main(){
   shared_ptr<S> sp1(new S);
   shared_ptr<S> sp2 = sp1->not_dangerous();
   return 0;}

当您这样做时,请记住您调用的对象shared_from_this必须由shared_ptr对象。这是行不通的:

int main(){
   S *p = new S;
   shared_ptr<S> sp2 = p->not_dangerous();     // don't do this}


查看完整回答
反对 回复 2019-07-22
?
忽然笑

这是我的解释,从一个螺母和螺栓的角度(顶部的答案没有与我‘点击’)。*注意,这是研究VisualStudio 2012附带的Shared_PTR和Enable_Shared_FROM_this的源代码的结果。也许其他编译器以不同的方式实现了Enable_Shared_FROM_this.*

enable_shared_from_this<T>增加一个私人weak_ptr<T>实例到T它持有“一次真正的参考计数“就.的情况而言T.

所以,当您第一次创建一个shared_ptr<T>在新的T*上,T*的内部WILE_PTR被重新计算为1。shared_ptr基本上回到这个weak_ptr.

T然后,在其方法中,调用shared_from_this获取shared_ptr<T>那,那个返回到相同的内部存储的引用计数。..这样,你总有一个地方T*的参考计数是存储的,而不是有多个shared_ptr不了解彼此的实例,每个实例都认为它们是shared_ptr负责点票。T当他们的参考数达到零时就删除它。


查看完整回答
反对 回复 2019-07-22

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信