用于包装库返回的数组的智能指针

时间:2012-07-17 08:36:11

标签: c++ boost stl smart-pointers visual-c++-2005

我正在运行VC ++ 2005,因此std::unique_ptr不可用AFAIK。我使用了一些有效执行return new T[n]的库函数(黑盒子),我想将结果包装在某个对象中,这意味着我不必在析构函数中删除它们。

VC ++ 2008中的标准库中是否存在任何内容?如果没有,unique_ptr的boost版本是否会像this answer一样完美地工作?

为了澄清注释中的一些混淆,库函数返回一个指向动态分配数组的原始指针,我无权更改...我需要将该指针包装并自动包装在一个对象中当对象超出范围时调用delete []

2 个答案:

答案 0 :(得分:0)

在2011年之前的标准库中,您所拥有的只是auto_ptr,适合从函数返回。但是,它仅适用于单个对象,而不适用于数组,因此不适合此用途。

据我所知,Boost中没有unique_ptr。有scoped_ptrscoped_array,但它们不可转让,因此无法从函数返回。

boost::shared_array可能是合适的,虽然它使用引用计数,因此与单个所有权指针相比具有(希望很小)开销。

std::vector可能是一个不错的选择;只要您的编译器支持“返回值优化”,您就可以(稍微小心)从函数中返回一个,而不需要任何不必要的内存分配或复制。但是,它的缺点是它不能防止意外复制数据。

更新:我刚刚注意到你的问题中的“黑匣子”这个词,我认为这可能意味着库函数会返回原始指针,并且你想将它们分配给一个智能指针,它会用{{{{{ 1}},并且不能修改函数本身。如果是这种情况,boost::scoped_array就应该这样做,并向那些根据我的评论删除答案的人道歉。

答案 1 :(得分:0)

这取决于你想要对结果值做什么。

一般来说,我会在C ++ 03中建议boost::scoped_ptrboost::scoped_array。但请注意,它们是以非常具体的思维方式制作的:限制资源的范围。也就是说,它们不仅仅是处理清理,它们还保证资源不会离开范围,即无法转移到调用者。

如果你想要更多,那么在C ++ 03中就不容易了(因为没有可移动的类型)。在这种情况下,您可能需要制作一个“扩展”boost::scoped_ptr,例如添加release方法以允许将内存传递给调用者(然后期望正确地处理它)。