2012-01-28 61 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,但在容器中使用它是安全的。