2012-01-28 59 views
0

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

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

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

+0

你是否可以将auto_ptrs存储在向量中?或者你真的指向auto_ptrs的指针? – thehouse 2012-01-28 01:45:30

+2

存储指向智能指针的原始指针会破坏使用智能指针的目的... – bames53 2012-01-28 02:12:54

回答

0

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

如果你想存储智能指针的容器来看看的unique_ptr如果你的编译器支持C++ 11的东西

+1

如果你不是,请参阅http://stackoverflow.com/questions/197048/idiomatic-use-of-stdauto-ptr- or-only-use-shared-ptr讨论pre-C++ 11选项。 – smparkes 2012-01-28 01:49:19

+0

如果我存储的指针是指向auto_ptr的普通指针,那么为什么会有意想不到的结果?假设auto_ptr(s)在向量之前没有被销毁。 – user1174679 2012-01-28 01:58:02

+0

指向auto_ptr的指针将工作(因为您避免了唯一的一个auto_ptr可以拥有数据)。但是因为你必须重新分配auto_ptr,为什么不把指针存储在向量中? – 2012-01-28 02:01:57

4

不能存储的auto_ptr本身在std::vector,而是存储一个普通的指针罚款,即使它指向的东西是auto_ptr

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

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