2012-01-14 23 views
1

コンテナがC++でどのように実装されているかを理解するのが難しいです。具体的には、スタックに割り当てられたデータとヒープに割り当てられたデータをどのように処理できますか。例:コンテナクラスに動的に割り当てられたメモリを扱う

vector<int> VectorA; 
VectorA.push_back (1); 
VectorA.push_back (2); 
VectorA.push_back (3); 

vector<int*> VectorB; 
VectorB.push_back (new int (1)); 
VectorB.push_back (new int (2)); 
VectorB.push_back (new int (3)); 

VectorBの整数が正しく削除されることをどう扱うか。 std :: vectorはデストラクタを呼び出すだけで、実際には何も削除していないことを覚えています。また、独自のLinkedListクラスを実装したい場合は、この特定の問題をどのように処理しますか?

+1

後者の場合、スマートポインタを使用しない場合は、ベクターから項目を削除する場所は、ポインタが参照するオブジェクトを必ず削除する必要があります。 – Joe

答えて

4

問題を処理する理想的な方法は、生ポインタの代わりにSmart Pointersをコンテナの要素として使用することです。
それ以外の場合は、手動でdo the memory management yourselfにする必要があります。

+1

'boost :: shared_ptr'のように(コンテナは内部的にコピーを作成するので)コピーをサポートするスマートポインタを使用していることを確認してください。たとえば、コンテナのコピーセマンティクスと互換性がないため、 'std :: auto_ptr'は使用しないでください。 –

+0

@ RemyLebeau-TeamB std :: auto_ptrは現在廃止予定です。私はAlsがそれを推薦しているとは思わない。 std :: unique_ptrまたはstd :: shared_ptrを使用できます。 – Jagannath

+0

確かに、多くの人が最新のC++標準を使用するコンパイラをまだ使用していません。 –

2

ベクトルに格納されたオブジェクトは、とにかく(ベクトルによって割り当てられたスペースに)ヒープに格納されます。

オブジェクトを別々に(オプションB)割り当てることは、ベクターの外で何とかして管理しない限り、ほとんど利点がありません。その場合、ベクトルは格納しているポインタを破棄し、オブジェクト自体を破壊するために実際の所有者を信頼することができます。

0

短い答えは、ほとんどの場合、そのようなことにはほとんど対処しないということです。標準コンテナ(例えば、std::vector)は、元のオブジェクトをまったく格納しません。オブジェクトのコピーを格納します。彼らは自分のコピーのストレージを管理し、元のストレージを管理するのはあなた次第です。

ポインタを格納する場合、基本的にポインタが指す記憶域を管理する責任があります。コンテナはまだコピーを作成しています(とストレージの管理をしています)が、ポインタのコピーであり、参照先のオブジェクトではありません。それはあなたに対処するまでです。

関連する問題