2

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

大约 VC++ 2008 的标准库中是否存在任何内容?如果不是,unique_ptr 的增强版本会像这个答案一样完美地工作吗?

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

4

2 回答 2

0

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

据我所知,unique_ptrBoost 中没有。有一个scoped_ptrand scoped_array,但它们是不可转移的,因此不能从函数中返回。

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

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

更新:我刚刚注意到您的问题中的“黑匣子”一词,我认为这可能意味着库函数返回原始指针,并且您想将它们分配给一个智能指针,该指针将用 破坏它们delete [],并且不能修改函数本身。如果是这样的话,boost::scoped_array应该做的伎俩,并向那些为回应我的评论而删除他们的答案的人道歉。

于 2012-07-17T08:50:51.800 回答
0

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

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

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

于 2012-07-17T09:49:15.803 回答