可以存储指向auto_ptr(s)的指针到std :: vector中吗?它安全吗?在向量中存储指向auto_ptr的指针
我列举了一个读取XML文件的文件夹,并用auto_ptr为每个文件创建了一个对象。我事先并不知道会有多少XML文件,我想使用一个向量来保存指向它们的指针列表。
我还假设,当指针从Vector中移除(或者矢量被销毁)时指针几乎消失了,所以我不必担心将它们设置为NULL。
可以存储指向auto_ptr(s)的指针到std :: vector中吗?它安全吗?在向量中存储指向auto_ptr的指针
我列举了一个读取XML文件的文件夹,并用auto_ptr为每个文件创建了一个对象。我事先并不知道会有多少XML文件,我想使用一个向量来保存指向它们的指针列表。
我还假设,当指针从Vector中移除(或者矢量被销毁)时指针几乎消失了,所以我不必担心将它们设置为NULL。
是的,你可以 - 但它是完全不安全的,会做各种意想不到的事情,让你感到惊讶。
如果你想存储智能指针的容器来看看的unique_ptr如果你的编译器支持C++ 11的东西
如果你不是,请参阅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
如果我存储的指针是指向auto_ptr的普通指针,那么为什么会有意想不到的结果?假设auto_ptr(s)在向量之前没有被销毁。 – user1174679 2012-01-28 01:58:02
指向auto_ptr的指针将工作(因为您避免了唯一的一个auto_ptr可以拥有数据)。但是因为你必须重新分配auto_ptr,为什么不把指针存储在向量中? – 2012-01-28 02:01:57
不能存储的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
,但在容器中使用它是安全的。
你是否可以将auto_ptrs存储在向量中?或者你真的指向auto_ptrs的指针? – thehouse 2012-01-28 01:45:30
存储指向智能指针的原始指针会破坏使用智能指针的目的... – bames53 2012-01-28 02:12:54