2012-01-28 11 views
0

auto_ptrへのポインタをstd :: vectorに格納することはできますか?それは安全ですか?ベクトル内のauto_ptrへのポインタを格納

XMLファイルで読み込んだフォルダを列挙し、auto_ptrでそれぞれのオブジェクトを作成します。 XMLファイルがいくつあるのかは事前にわかっていないので、ベクトルを使用して基本的にポインタのリストを保持したいと考えています。

私はまた、ポインタがVectorから削除されたとき(またはベクトルが破棄されたとき)、ポインタがかなりなくなっていると仮定しているので、NULLに設定することを心配する必要はありません。

+0

auto_ptrsをベクターに保存することはできますか?それとも、auto_ptrsへのポインタを意味していますか? – thehouse

+2

スマートポインタへの生ポインタを格納する方法スマートポインタを使用する目的を打ち消す種類... – bames53

答えて

0

はい、それは完全に危険であり、あなたを驚かせるすべての種類の予期しないことを行うでしょう。

あなたはコンテナにスマートポインタを保存したい場合は、あなたのコンパイラはあなたがstd::vectorauto_ptr自体を格納しますが、無地のポインタを格納することであることはできませんC++ 11のもの

+1

そして、もしそうでなければ、http://stackoverflow.com/questions/197048/idiomatic-use-of-stdauto-ptr- or-only-use-shared-ptrを参照してください。 – smparkes

+0

私が格納しているポインタがauto_ptrへの通常のポインタである場合、なぜ予期しない結果が生じるのでしょうか? auto_ptr(s)がベクトルの前に破壊されていないと仮定します。 – user1174679

+0

auto_ptrへのポインタが機能します(auto_ptrがデータを所有できるのを避けるためです)。しかし、あなたはauto_ptrを再割り当てする必要があるので、ベクトルへのアイテムへのポインタの格納だけではありません –

4

をサポートしている場合unique_ptrを見てたとえそれが指しているものであっても、からまではauto_ptrです。

私はなぜあなたがそれをしたいと思うかわかりません。 auto_ptrの全体点は、ヒープ割り当てオブジェクトがスコープ外に出たときに自動的に削除されるようにすることです。 auto_ptr自体を手動で削除する必要がある場合は、その恩恵を失います。

ベクターにヒープ割り当てオブジェクトを安全に保存する場合は、auto_ptrの代わりにstd::tr1::shared_ptrを使用するか、Boostのポインタコンテナを使用できます。または、C++ 11を使用している場合、std::unique_ptrstd::auto_ptrと同じですが、コンテナでの使用は安全です。

関連する問題