当前位置:  开发笔记 > 编程语言 > 正文

为此获得boost :: shared_ptr

如何解决《为此获得boost::shared_ptr》经验,为你挑选了5个好方法。

boost:shared_ptr在我的代码中广泛使用.实际上,堆上分配的大多数对象都是由a保存的shared_ptr.不幸的是,这意味着我无法传递this任何需要的函数shared_ptr.考虑以下代码:

void bar(boost::shared_ptr pFoo)
{
    ...
}

void Foo::someFunction()
{
    bar(this);
}

这里有两个问题.首先,这不会编译,因为T*构造函数shared_ptr是显式的.其次,如果我强制它构建,bar(boost::shared_ptr(this))我将创建第二个指向我的对象的共享指针,最终将导致双删除.

这让我想到了一个问题:是否有任何标准模式可以从其中一个对象的方法中获取您知道的现有共享指针的副本?使用侵入式引用计数是我唯一的选择吗?



1> Brian R. Bon..:

您可以从enable_shared_from_this派生,然后您可以使用" shared_from_this()"而不是"this"来生成指向您自己的自身对象的共享指针.

链接示例:

#include 

class Y: public boost::enable_shared_from_this
{
public:

    shared_ptr f()
    {
        return shared_from_this();
    }
}

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

从成员函数生成线程到boost :: bind到shared_from_this()而不是这个时,这是一个好主意.它将确保不释放对象.



2> Mark Ransom..:

只需使用函数参数的原始指针而不是shared_ptr.智能指针的目的是控制对象的生命周期,但C++作用域规则已经保证了对象的生命周期:它至少与函数结束一样长.也就是说,调用代码不能在函数返回之前删除对象; 因此,只要您不尝试删除函数内的对象,就可以保证"哑"指针的安全性.

您需要将shared_ptr传递给函数的唯一时间是您希望将对象的所有权传递给函数,或者希望函数复制指针.



3> David Pierre..:

boost有这个用例的解决方案,请检查enable_shared_from_this



4> Greg Rogers..:

你真的在酒吧内制作更多pFoo的共享副本吗?如果你内心没有做任何疯狂的事情,那就这样做:

void bar(Foo &foo)
{
    // ...
}



5> Johan Lundbe..:

使用C++ 11 shared_ptr,enable_shared_from_this现在是标准库.顾名思义,后者正好适用于这种情况.

http://en.cppreference.com/w/cpp/memory/shared_ptr

http://en.cppreference.com/w/cpp/memory/enable_shared_from_this

示例基于以上链接中的示例:

struct Good: std::enable_shared_from_this{
    std::shared_ptr getptr() {
        return shared_from_this();
    }
};

使用:

std::shared_ptr gp1(new Good);
std::shared_ptr gp2 = gp1->getptr();
std::cout << "gp2.use_count() = " << gp2.use_count() << '\n';

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有