如果我使用 auto_ptr 来保存指向动态分配数组的指针,当 auto_ptr 被杀死时,它将使用普通的删除操作而不是delete[],因此不会删除我分配的数组。
我如何(正确)在动态分配的数组上使用 auto_ptr?
如果这是不可能的,动态分配的数组是否有另一种智能指针替代方案?
提前致谢。
你没有。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()
也适用于空向量。
boost::shared_array是您正在寻找的。
编辑:
如果你想避免使用 boost,我建议只使用std::vector
它们是数组下面的,不需要担心内存分配。实际上,这是一个比shared_array
无论如何都更好的解决方案。
既然你表明你想使用,auto_ptr
那么你就不需要shared_array
. 因此,只需使用std::vector,因为它们是为替换动态分配的数组而定制的,这实际上是您尝试使用auto_ptr
.
如果你想自己做(即不使用boost),那么首先将动态数组包装在一个类中。调用类的析构函数delete[]
。然后auto_ptr<Wrapper>
可以调用delete
类,内存将被正确释放。
在这种情况下,正确的 boost 智能指针是boost::scoped_array,而不是更著名的 boost::shared_array,因为std::auto_ptr
它是唯一的所有权指针。与共享所有权指针相反。在 C++0x 中,正确的指针是std::unique_ptr
,如果它指向一个数组,它将调用 delete[],如果它指向单个对象,它将调用 delete。
使用 auto_ptr(使用动态分配的数组或其他任何东西)的正确方法是使用其他东西。在您的情况下,可能是来自 TR1 的 boost::shared_array 或 shared_ptr> 或 shared_ptr> 。在一般情况下 shared_ptr 或 unique_ptr 是实际上是智能的智能指针。停止使用 auto_ptr。