【问题标题】:storing pointers to auto_ptr in vector在向量中存储指向 auto_ptr 的指针
【发布时间】:2012-01-28 01:42:55
【问题描述】:

可以将指向 auto_ptr(s) 的指针存储在 std::vector 中吗?安全吗?

我枚举一个读取 XML 文件的文件夹,并使用 auto_ptr 为每个文件夹创建一个对象。我事先不知道会有多少 XML 文件,我想使用一个向量来保存指向它们的指针列表。

我还假设当从向量中删除指针(或向量被销毁)时,指针几乎消失了,所以我不必担心将它们设置为 NULL。

【问题讨论】:

  • 您的意思是可以将 auto_ptrs 存储在向量中吗?还是您真的是指指向 auto_ptrs 的指针?
  • 将原始指针存储到智能指针有点违背了使用智能指针的目的......

标签: c++ vector containers auto-ptr


【解决方案1】:

您不能将 auto_ptr 本身存储在 std::vector 中,但存储一个普通指针是可以的,即使它指向 的对象是 auto_ptr

不过,我不明白您为什么要这样做。 auto_ptr 的重点是确保堆分配的对象在超出范围时自动删除。如果必须手动删除 auto_ptr 本身,您将失去该优势。

如果您想将堆分配的对象安全地存储在向量中,您可以使用std::tr1::shared_ptr 而不是auto_ptr,或者使用Boost 的指针容器。或者,如果您使用 C++11,std::unique_ptrstd::auto_ptr 类似,但在容器中使用是安全的。

【讨论】:

    【解决方案2】:

    是的,你可以 - 但它完全不安全,并且会做各种让你吃惊的意想不到的事情。

    如果您想在容器中存储智能指针,请查看 unique_ptr(如果您的编译器支持 C++11 内容)

    【讨论】:

    • 如果您不是,请参阅stackoverflow.com/questions/197048/… 以讨论 C++11 之前的选项。
    • 如果我存储的指针是指向 auto_ptr 的普通指针,那么为什么会有意想不到的结果呢?假设 auto_ptr(s) 没有在向量之前被销毁。
    • 指向 auto_ptr 的指针会起作用(因为您避免只有 1 个 auto_ptr 可以拥有数据)。但是由于您必须重新分配 auto_ptr,为什么不将指向您的项目的指针存储在向量中
    猜你喜欢
    • 1970-01-01
    • 2012-09-25
    • 2011-08-04
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    相关资源
    最近更新 更多