在C ++中使用智能指针分配和删除内存的有效方法

时间:2012-03-28 12:07:23

标签: c++ boost

我有函数some_func_1,它将创建一个some_type类型的对象,并返回指向为此对象分配的内存的指针。

必须使用特殊some_func_2删除此内存。可以使用boost::shared_ptr<some_type>并指定some_func_2作为自定义删除功能,但它不是有效的方法,因为我只有一个线程,并且只有一个分配内存的用户。

换句话说,我需要一些像scoped_ptr这样的东西,但有可能定义自定义的释放函数。如何最大限度地提高效率?

3 个答案:

答案 0 :(得分:3)

您可能正在寻找std::unique_ptr(可在C ++ 11中使用)。

然而,你在说什么效率问题?当你知道你只有一个指针实例时,你是不是想要一个引用计数指针?

如果是这样,请不要担心:确定此处的引用计数似乎有点无用,但不应该导致很多性能问题。您是否已对自己的代码进行了分析以确定其存在问题?

除非您在特别低的内存条件下或在每个处理器周期都很重要的环境中运行,否则我非常怀疑您是否会注意到差异。

首先编写可维护代码,然后,如果遇到性能问题,请进行配置和优化。反过来做是浪费时间。

答案 1 :(得分:1)

boost::scoped_ptr设计人员不希望支持自定义解除分配器以减少任何可能的开销。引用boost mailing group

  

如果需要shared_ptr样式的运行时自定义deallocator支持,   这是不受支持的,因为考虑了开销   scoped_ptr是不可接受的。改为使用shared_ptr。

在C ++ 11 std::unique_ptr中可以调用自定义deallocator。您必须将函数对象或左值引用传递给函数或函数对象作为std::unique_ptr模板的第二个参数。

答案 2 :(得分:0)

另一种可能性是将 some_type 封装在 another_type 中,使用您喜欢的任何智能指针并让another_type的析构函数处理some_type的解除分配。