2011-01-21 8 views
2

ポインタのSTL vectorが与えられている場合、vector自体を破棄する前に各要素の割り当てを解除する必要があります。 STLライブラリが自動的にそれを行うことを妨げる技術的な影響はありますか?STLベクトル割り当て

おかげ

+0

"ポインタのSTLベクトルを指定すると、各要素はベクトル自体を破棄する前に割り当て解除する必要があります"いいえ、それは従いません。いずれにしても、手動でリソースを管理するのは悪いです。スマートポインタを使用します。 – GManNickG

答えて

2

あなたは

+0

ポインタが共有されている場合!それ以外の場合はboost :: ptr_vectorを使用してください。 –

5

に理由を自動割り当て解除を受信するスマートポインタのベクトルが破壊され

利用ベクトルを(例えば後押し:: shared_ptrのを)削除すべきではないそこにポインタを格納することができますSTLはあなたのためにそれをしませんそれはそれが仮定されているかどうかを知ることができないということです。あなたは配列へのポインタベクトル(delete[]を行う必要があります)、通常のオブジェクトへのポインタ(その場合はdeleteを実行する必要があります)、またはカスタムアロケータからのメモリのベクトルを持つかもしれません。これらのポインタは他のオブジェクトと共有することもできます。その場合、それらのポインタを削除すると、他のオブジェクトがガベージ・データを指し示し、未定義の動作につながります。これらのポインタは、スタック割り当てメモリでもよく、その場合、割り当て解除は必要ありません。

2

ベクトルにポインタが含まれている場合、ポインタがダイナミックメモリを指しているとは限りません。もしそうなら、deleteまたはdelete[]を各ポインタに適用する必要がありますか?また、ポインタが新しい配置を使用して作成されたオブジェクトを指している場合はどうなりますか?これらの質問には、ライブラリではなく、プログラマが回答する必要があります。

+2

"静的メモリを指しているわけではありません"と "動的"と言います。 –

+0

@トニー・イエップ、私が作った奇妙なタイプミスの1つ:-)それを指摘してくれてありがとう。 – Oswald