3

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

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

如果这是不可能的,动态分配的数组是否有另一种智能指针替代方案?

提前致谢。

4

5 回答 5

10

你没有。std::auto_ptr不打算与数组一起使用。

避免使用new[]and delete[]。改为使用std::vector这也是 Stroustrup 的建议。

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

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

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

于 2010-06-01T01:17:02.573 回答
5

boost::shared_array是您正在寻找的。

编辑:

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

既然你表明你想使用,auto_ptr那么你就不需要shared_array. 因此,只需使用std::vector,因为它们是为替换动态分配的数组而定制的,这实际上是您尝试使用auto_ptr.

于 2010-06-01T00:36:19.817 回答
1

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

于 2010-06-01T00:41:18.777 回答
1

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

于 2010-06-01T01:58:31.610 回答
0

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

于 2010-06-01T00:43:25.373 回答