私は c++ を学んでいますが、ベクトルとの混乱を経験しています。具体的には、静的ベクターが内部で動的配列を実装している場合、動的配列によって使用されているスタック メモリは、プログラムの終了時に解放されますか、それとも削除操作を使用するか、静的ベクターでデストラクタを呼び出す必要がありますか?
5 に答える
削除操作を使用する必要がありますか
を使用して問題のものを割り当てなかった場合はnew
、決してそれを呼び出さないdelete
でください。
または静的ベクトルでデストラクタを呼び出しますか?
new
placement-を使用してその場で再初期化しなかった場合は、デストラクタを明示的に呼び出さないでください。
(標準ライブラリの std::vector を実装していない場合は、配置をnew
自分で使用する必要がないことはほぼ確実です。)
グローバル変数は、プログラムの終了時に自動的にクリーンアップされます。
ベクトルには、独自の内部メモリ管理があります。これは、作成中に (コンストラクターで) 必要と思われるものと、必要なときに必要になる追加のメモリを割り当てることを意味します。
ベクトルが破棄されると (スコープ外になるか、プログラムが終了するか、または手動で削除されます)、内部的に割り当てられたすべてのメモリが一緒に削除されます。
静的ベクトルの意味がわかりません。std::vector は、サイズ変更可能な配列を管理する STL コンテナーです ( http://www.cplusplus.com/reference/stl/vector/を参照)。グローバル コンテキストでの static はファイル ローカルを意味し、含まれているコンパイル ユニットの外部でシンボルが表示されないようにします。クラス コンテキストでの static は、(クラス インスタンスではなく) クラス型に関連付けられたグローバル変数を作成するための名前空間のトリックです。
std::vector が静的であるかどうかは、実装方法とは関係ありません。すべての std::vector インスタンスは、動的に割り当てられた T の連続した配列を割り当てて維持します。 vector のデストラクタは、以前に割り当てた T の配列を削除します。このメモリを割り当てたり解放したりする必要はなく、それが起こっていることを知る必要さえありません。std::vector インスタンスが静的な場合、そのデストラクタは main() の終了後に呼び出されます。スタックに割り当てられている場合、スコープ外になるとデストラクタが呼び出されます。電話すれば
std::vector<T>* p = new std::vector<T>();
あなたは電話する責任があります
delete p;
p が範囲外になる前に。
最後に、ベクトル自体に動的に割り当てられたポインターが含まれている場合は、それらも削除する必要があります。
// 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();
C/C++ の経験則は次のとおりです。
あなたが新しくしたものも、あなたは削除します。
vector が使用する配列は新しくしなかったので、削除する必要はありません。
ベクトルのデストラクタは、プログラムが終了する前に呼び出されます。
ベクトルがオブジェクトへのポインターを保持している場合、それらのデストラクタは呼び出されませんが、ほとんどのプラットフォームでは、プログラムが終了すると、プロセスによって割り当てられたすべてのメモリが解放されます。
すべてのメモリは、プログラムの終了時に解放されます。