2011-12-23 30 views
0

私はC++を学んできましたが、私はベクトルと混乱しています。具体的には、静的ベクトルが内部的に動的配列を実装する場合、プログラムが終了すると、動的配列によって使用されているスタックメモリが解放されるのか、または削除操作を使用するのか静的ベクトルでデストラクタを呼び出すべきですか?静的ベクトルは削除する必要がありますか?

+1

ローカル変数が有効範​​囲外になると、そのデストラクターが自動的に呼び出されます。 'std :: vector'のデストラクタは、存在するときにローカルの' std :: vector'オブジェクトによって内部的に割り当てられた動的メモリを解放します。グローバルオブジェクトのデストラクタは、プログラムが終了する前に同様に呼び出されます。 – lapk

+2

"静的ベクトル"のコード例を提供してください。 'static'はC++の多くのことを意味します。 –

答えて

-1

すべてのメモリはプログラムの終了時に解放されます。

1

ベクターには独自の内部メモリ管理機能があります。つまり、作成時(コンストラクタ内で)に必要と思われるものと、必要なときに必要となる追加のメモリが割り当てられます。

ベクターが破壊されると(範囲外になったり、プログラムが終了したり、手動で削除されたりすると)、内部的に割り当てられたすべてのメモリが削除されます。

0

ベクトルのデストラクタは、プログラムが終了する前に呼び出されます。

ベクトルがオブジェクトへのポインタを保持している場合、それらのデストラクタは呼び出されませんが、ほとんどのプラットフォームでは、プログラムによって割り当てられたすべてのメモリは、プログラムの終了時に解放されます。

3

あなたがnewを使用して、問題の事を割り当てなかった場合、私はそれに続い決してコールdelete、削除操作

を使用する必要があります。

または静的ベクトルでデストラクタを呼び出しますか?

あなたがplacement- newを使用して、場所ではありません再初期化事をした場合は、明示的にデストラクタを呼び出すことはありませんが。

は(あなたが標準ライブラリのためのstd ::ベクトルを実装している人でない場合は、これまで、 newを自分でplacement-使用する必要はありませんすることはほぼ確実である。)

グローバル変数は、クリーンアップを取得しますプログラム終了時に自動的に

0

静的ベクトルの意味がわかりません。 std :: vectorは、サイズ変更可能な配列を管理するSTLコンテナです(http://www.cplusplus.com/reference/stl/vector/参照)。グローバルコンテキストで静的とは、シンボルが含まれているコンパイルユニットの外側に表示されないように、ローカルファイルを意味します。クラスコンテキスト内のstaticは、クラス型(クラスインスタンスではなく)に関連付けられたグローバル変数を作成するための名前空間のトリックです。

std :: vectorが静的であるかどうかは、それがどのように実装されるかとは関係がありません。すべてのstd :: vectorインスタンスは、動的に割り当てられたTの連続した配列を割り当てて維持します。vectorのデストラクタは、以前に割り当てられたTの配列を削除します。あなたはこのメモリを割り当てたり解放したり、それが起こっていることを知る必要はありません。 std :: vectorインスタンスが静的であれば、main()の終了後にデストラクタが呼び出されます。それがスタックに割り当てられている場合、そのデストラクターはスコープ外になると呼び出されます。あなたは

std::vector<T>* p = new std::vector<T>(); 

を呼び出す場合は、pはスコープの外に出る前に

delete p; 

を呼び出すための責任を負うことになります。

最後に、ベクトル自体に動的に割り当てられたポインタが含まれている場合は、そのポインタも削除する責任があります。 C/C++での親指の

// Not exception safe code! 
std::vector<int*> v; 
v.push_back(new int(4)); 
v.push_back(new int(5)); 
std::cout << *v[0] << ", " << *v[1] << std::endl; 
for (auto iter = v.begin(); iter != v.end(); ++iter) { 
    delete *iter; 
} 
v.clear(); 

良いルールは以下のとおりです。

新しい、あなたはまた、削除したこと。

ベクターで使用されている配列を新規作成していないので、削除する必要はありません。

+0

'あなたはそれらを削除する責任も負うでしょう。 - >提案された追加:その気になるものを安全にするために...;) –

+0

hehe ..動的に割り当てられたポインタを格納する私のコード例は、あなたがnew.dのメモリを保存すると、v.clear()を呼び出すときにvectorクラスがあなたのためにdeleteを呼び出さないという点を説明する良いデザインです。 –

関連する問題