2011-01-17 15 views
2

私はオブジェクトへのポインタのベクトルを持っています(私はポインターとしてポインタを持っています。私はたくさんの位置をぶつけてしまいます。ポインタのベクトルとC++のオブジェクトを削除する

とにかく、私は最終的にベクトルを削除する必要がありますが、それが指し示すオブジェクトはまだ有効である必要があります。ベクトル内のすべてのオブジェクトのデストラクタ。これはオブジェクトの配列のときに意味がありますが、配列がオブジェクトへのポインタの配列であれば、ポインタが指すオブジェクトも削除されるか、削除する必要があります手動?

自動的に削除された場合、実際にオブジェクトを別の場所にコピーし、ベクター内のポインタをそれらのオブジェクトを指し示すようにすることが、オブジェクトを保持する唯一の方法です(別のベクターで使用されたとします)オリジナル)?

ありがとうございます。

+0

私の[関連する回答](http://stackoverflow.com/questions/4260464/does-stdlistremove-method-call-destructor-of-each-removed-element/4261074#4261074)です。 – fredoverflow

答えて

4

ポインタでデストラクタを呼び出す値は何もしません。 (一方、ポインタ値にdeleteを呼び出すと、尖った-するために、オブジェクト、がメモリを解放するためにデストラクタが実行されます。)

オブジェクトへのポインタの配列の場合は、あなたがオブジェクトを解放しなければなりませんもしそれがあなたが望むなら手動で。

+0

ありがとうございます。私はそれが最良の説明を提供するので、答えとしてこれをマークしています。 (これまでのとにかく) –

1

ポインタのベクトルを使用している場合は、ベクターを削除(またはクリア)すると、実際のオブジェクトがまだ周囲にあるはずです。

1

Boost shared_ptrのように、スマートポインタをベクターに使用できます。

+0

実際には、普通のバニラのポインターがまさに彼がここで欲しいものであるように思えます。 –

+0

@ T.E.D:そうですね、質問を逆に読むと思います。 8v)しかし、 'shared_ptr'を使うことは、オブジェクトを使うすべてのものに使われていると悪い考えではないかもしれません。 –

+0

Mmm ...これらは面白そうです。それを私の注意に持ってくれてありがとう。 –

1

実際には、コンテナ内のオブジェクトはすべて破壊されます。しかし、あなたのコンテナ内のオブジェクトはすべてポインタなので、何もすることはありません。

あなたの質問を読んで、それはまさにあなたがしたいと思うように聞こえるので、あなたは良いです。

1

これは問題ではありません。これがdeleteキーワードの理由です。スコープ外に出ると、オブジェクトのデストラクタが呼び出されます。ポインタが有効範囲外になると、メモリリークが発生しやすくなります。ここでも同じことが適用されるので、特別なことを行う必要はありません。

これらは引き続き存在します。

0

とにかく、私は最終的にベクターを削除する必要がありますが、それが指し示すオブジェクトは依然として有効である必要があります。ドキュメントは、ベクトル内のすべてのオブジェクトに対してデストラクタを呼び出すと言います。これはオブジェクトの配列では意味がありますが、配列がオブジェクトへのポインタの配列であれば、ポインタが指し示すオブジェクトも削除されるのか、それとも手動で削除する必要がありますか?

まず、この読み:今すぐ自問してみてくださいhttp://crazyeddiecpp.blogspot.com/2010/12/pet-peeve.html

を、ドキュメントは、ベクターが、すべては、それが点を含むオブジェクトというすべてのオブジェクトを削除することを言うのでしょうか?

「いいえ」でその質問に答えることができます。

「はい」でこの質問に答えることができれば...別のドキュメントを試してみてください。

関連する問題