Boost中是否存在与boost::shared_ptr
一起用于静态对象的库存无操作解除分配器。
我知道写这篇文章非常简单,但是如果已经有一些功能,我不想把我的代码撒上额外的小函数。
答案 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中没有任何功能可以完成这项工作,但听起来并不像他们想要包含的那样。
编辑:阅读完评论和一些文档后,可以归结为:
参考泄漏。在某些时候,执行:
new shared_ptr( my_global_shared_ptr );
优点:从概念上讲很容易。缺点:你在堆上漏了一些东西。
自定义解除分配器。由于shared_ptr
几乎不需要deallocator函数,因此像其他答案中提供的匿名身份函数就可以了。
优点:利用Boost并且绝对没有开销。 Disdvantages:需要一些文档。
非静态全局对象。如果您的对象存在全局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)
<=
1.54,请使用boost/log/utility/empty_deleter.hpp
。==
1.55,请使用boost/utility/empty_deleter.hpp
。>=
1.56,请使用boost/core/null_deleter.hpp
。