2010-04-26 118 views
17

是否有加速A股无操作释放器与boost::shared_ptr静态对象使用等空操作释放器升压:: shared_ptr的

我知道这是超琐碎写的,但我不如果已经有一个可用的函数,想要使用额外的小函数来抛洒我的代码。

+4

如果该对象不需要被破坏,那么为什么你首先将它放入shared_ptr? – 2010-04-26 03:01:26

+5

如果你到处都有智能指针,并且想要将堆栈或成员变量传递给需要'shared_ptr'的函数,那么它非常方便。 – 2010-04-26 03:02:47

+1

@Mark Ransom:你让我想到了令我畏缩的代码库。 :P – 2010-04-26 03:16:47

回答

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的最后一个实例为止。

+0

看起来这是如此接近。 – 2011-03-09 06:25:01

1

仅仅为了获取额外的引用而不是更简洁,所以释放器永远不会被调用? (虽然这还不是很干净。)

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

编辑:读了评论和一个小文件,它归结为:

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

    new shared_ptr(my_global_shared_ptr); 
    

    优点:概念上很简单。缺点:你正在泄漏堆中的东西。

  2. 自定义释放器。因为shared_ptr只需要很少的释放器函数,所以在其他答案中提供的匿名身份函数会很好。

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

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

+0

你会如何去采取额外的参考?我不认为shared_ptr的数量是可以访问的。 – 2010-04-26 03:01:23

+0

@Mark Ransom:我认为他的意思是复制'shared_ptr'并将其存储在某个地方。 – 2010-04-26 03:02:35

+0

是的,但额外的副本最终会被销毁。看起来不太实际。 – 2010-04-26 03:06:14

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 ::拉姆达:: _ 1' 创建一个空的仿它有一个参数。

您可能想要在那里放一个//注释,让人们知道您为什么这么做。

+1

这将落入*“我不想撒上我的代码”*类别。 – 2010-04-26 03:03:17

+0

该解决方案涉及比使用假设的boost :: no_op_deallocator()代替boost :: lambda :: _ 1更多的喷洒? – scjohnno 2010-04-26 03:08:07

+2

一个非常聪明的解决方案,但我认为我更喜欢在某个地方使用微不足道的功能,并给它一个描述性的名字。 – 2010-04-26 03:08:25

0

FWIW,这就是我正在使用的。 我在单元测试中使用它来调整本地到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()); 
} 
+0

OP特意询问了Boost或stdlib已经提供的解决方案。他*知道*编写这样的函数/函数是非常微不足道的。 – Xeo 2011-12-25 11:14:19