在动态分配的数组上使用auto_ptr的正确方法是什么?

时间:2010-06-01 00:33:19

标签: c++ auto-ptr

如果我使用auto_ptr来保存指向动态分配的数组的指针,当auto_ptr被杀死时,它将使用普通的删除操作而不是删除[] 因此不会删除我分配的数组。

我如何(正确)在动态分配的数组上使用auto_ptr?

如果无法做到这一点,是否还有另一种智能指针替代动态分配的数组?

提前致谢。

5 个答案:

答案 0 :(得分:10)

你没有。 std::auto_ptr并不适用于数组。

避免使用new[]delete[]。请改用std::vectorThis is Stroustrup's recommendation too.

如果您正在使用数组,因为您需要将其传递给需要指针的代码,您可以简单地传递(非空)向量的第一个元素的地址。例如:

std::vector<char> buf(size);
fgets(&buf[0], buf.size(), stdin);

请注意,在C ++ 11中,您可以(并且应该)使用buf.data()而不是&buf[0]; buf.data()也适用于空矢量。

答案 1 :(得分:5)

boost::shared_array就是你要找的。

编辑:

如果你想避免使用boost我会建议只使用std::vector它们是数组下面的,并且不需要担心内存分配。实际上,这是一个比shared_array更好的解决方案。

由于您表明您想要使用auto_ptr,因此您不需要shared_array的引用计数和所有权模型。因此,只需使用std::vector来定义动态分配的数组,这正是您尝试使用auto_ptr管理的数据。

答案 2 :(得分:1)

如果你想自己做(即不使用boost),那么首先将动态数组包装在一个类中。让类的析构函数调用delete[]。然后auto_ptr<Wrapper>可以在类上调用delete,内存将被正确释放。

答案 3 :(得分:1)

在这种情况下,正确的boost智能指针是boost::scoped_array,而不是更着名的boost :: shared_array,因为std::auto_ptr是唯一的所有权指针。共享所有权指针的相反。在C ++ 0x中,正确的指针是std::unique_ptr,如果它指向一个数组,它将调用delete [],如果它指向一个对象,则调用delete。

答案 4 :(得分:0)

使用auto_ptr(使用动态分配的数组或其他任何东西)的正确方法是使用其他内容。 boost :: shared_array或者shared_ptr&gt;或shared_ptr&gt;在您的情况下从TR1。在一般情况下,shared_ptr或unique_ptr是智能指针,实际上是智能的。停止使用auto_ptr。