boost :: shared_ptr的no-op解除分配器

时间:2010-04-26 02:17:02

标签: c++ boost

Boost中是否存在与boost::shared_ptr一起用于静态对象的库存无操作解除分配器。

我知道写这篇文章非常简单,但是如果已经有一些功能,我不想把我的代码撒上额外的小函数。

6 个答案:

答案 0 :(得分:10)

是的,这里有一个:

#include <boost/serialization/shared_ptr.hpp> // for null_deleter

class Foo
{
  int x;
};

Foo foo;
boost::shared_ptr< Foo > sharedfoo( &foo, boost::serialization::null_deleter() );

当然,存在一个危险,即您需要知道您调用的函数不存储shared_ptr供以后使用,因为它实际上违反了shared_ptr的策略,因为底层对象保持有效,直到shared_ptr的最后一个实例。

答案 1 :(得分:3)

解决方案使用Boost.Lambda:

#include <boost/shared_ptr.hpp>
#include <boost/lambda/lambda.hpp>

int main()
{
    int *p = new int(5);

    {
        boost::shared_ptr<int> sp(p, boost::lambda::_1);
    }

    delete p;
}

'boost :: lambda :: _ 1'创建一个带有一个参数的空函子。

你可能想在那里放一个//评论让人们知道你为什么这么做。

答案 2 :(得分:1)

仅仅采取额外的参考不是更清洁,所以从不调用deallocator吗? (虽然那还不是很干净。)

我不能说Boost中没有任何功能可以完成这项工作,但听起来并不像他们想要包含的那样。

编辑:阅读完评论和一些文档后,可以归结为:

  1. 参考泄漏。在某些时候,执行:

    new shared_ptr( my_global_shared_ptr );
    

    优点:从概念上讲很容易。缺点:你在堆上漏了一些东西。

  2. 自定义解除分配器。由于shared_ptr几乎不需要deallocator函数,因此像其他答案中提供的匿名身份函数就可以了。

    优点:利用Boost并且绝对没有开销。 Disdvantages:需要一些文档。

  3. 非静态全局对象。如果您的对象存在全局shared_ptr,那么它应该是访问它的唯一方法。用shared_ptr初始化的new my_class替换全局声明。我认为这是最好的。

答案 3 :(得分:1)

在Boost bug追踪器上有一张这样的票:https://svn.boost.org/trac/boost/ticket/1913 - 很长一段时间都没有活动,直到两周前发生一些杂音。

答案 4 :(得分:0)

FWIW,这就是我正在使用的。 我在单元测试中使用它来将local调整为shared_ptr。

// The class NoOp_sptr_Deleter can be used to construct a shared_ptr<>()
// that will NOT delete the pointee.
// This can be helpful in unit-testing. Wrapping a local as a shared_ptr.
// Do take care with the lifetimes though.
struct NoOp_sptr_Deleter
{
    void operator()(void const *) const {}
};

template<typename T>
boost::shared_ptr<T> FakeSharedPtrFromRef(T& aRef)
{
    return boost::shared_ptr<T>(&aRef, NoOp_sptr_Deleter() );
}

答案 5 :(得分:0)