在动态分配的数组上使用 auto_ptr 的正确方法是啥?
Posted
技术标签:
【中文标题】在动态分配的数组上使用 auto_ptr 的正确方法是啥?【英文标题】:What is the correct way of using an auto_ptr on dynamically allocated arrays?在动态分配的数组上使用 auto_ptr 的正确方法是什么? 【发布时间】:2011-02-26 03:53:50 【问题描述】:如果我使用 auto_ptr 来保存指向动态分配数组的指针,当 auto_ptr 被杀死时,它将使用普通的 delete 操作而不是 delete[] 因此不会删除我分配的数组。
我如何(正确)在动态分配的数组上使用 auto_ptr?
如果这不可能,是否有另一种智能指针替代动态分配的数组?
提前致谢。
【问题讨论】:
【参考方案1】:你没有。 std::auto_ptr
不适合与数组一起使用。
避免使用new[]
和delete[]
。请改用std::vector
。 This is Stroustrup's recommendation too.
如果您因为需要将数组传递给需要指针的代码而使用数组,则可以简单地传递(非空)向量的第一个元素的地址。例如:
std::vector<char> buf(size);
fgets(&buf[0], buf.size(), stdin);
请注意,在 C++11 中,您可以(并且应该)使用 buf.data()
而不是 &buf[0]
; buf.data()
也适用于空向量。
【讨论】:
【参考方案2】:boost::shared_array 是您要找的。p>
编辑:
如果你想避免使用 boost,我建议只使用std::vector
,它们是数组的底层,无需担心内存分配。实际上,无论如何这都是比shared_array
更好的解决方案。
既然你表明你想使用auto_ptr
,那么你就不需要shared_array
的引用计数和所有权模型。因此,只需使用 std::vector,因为它们是为替换动态分配的数组而设计的,而这正是您尝试使用 auto_ptr
管理的内容。
【讨论】:
【参考方案3】:如果你想自己做(即不使用 boost),那么首先将动态数组包装在一个类中。让类的析构函数调用delete[]
。然后auto_ptr<Wrapper>
可以调用类上的delete
,内存将被正确释放。
【讨论】:
【参考方案4】:在这种情况下,正确的 boost 智能指针是 boost::scoped_array,而不是更著名的 boost::shared_array,因为 std::auto_ptr
是唯一的所有权指针。共享所有权指针的相反。在 C++0x 中,正确的指针是 std::unique_ptr
,如果它指向一个数组,它将调用 delete[],如果它指向单个对象,它将调用 delete。
【讨论】:
【参考方案5】:使用 auto_ptr(使用动态分配的数组或其他任何东西)的正确方法是使用其他东西。在您的情况下,可能是来自 TR1 的 boost::shared_array 或 shared_ptr> 或 shared_ptr> 。在一般情况下 shared_ptr 或 unique_ptr 是实际上是智能的智能指针。停止使用 auto_ptr。
【讨论】:
这不是真的。 auto_ptr 有有效的用例。诚然,这对新手来说并不容易理解,但是你不应该使用它们的毯子只是一个糟糕的建议。 如果你有 shared_ptr 和 unique_ptr ,你就可以确定 auto_ptr 在这个容器中是否安全等等。你需要仔细考虑使用的工具是当我得到一个工具时我很乐意放弃的工具更好的选择; shared_ptr 和 unique_ptr 是更好的选择。以上是关于在动态分配的数组上使用 auto_ptr 的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
智能指针的模拟实现 auto_ptr scoped_ptr shared_ptr