私はC++を学んできましたが、私はベクトルと混乱しています。具体的には、静的ベクトルが内部的に動的配列を実装する場合、プログラムが終了すると、動的配列によって使用されているスタックメモリが解放されるのか、または削除操作を使用するのか静的ベクトルでデストラクタを呼び出すべきですか?静的ベクトルは削除する必要がありますか?
答えて
すべてのメモリはプログラムの終了時に解放されます。
ベクターには独自の内部メモリ管理機能があります。つまり、作成時(コンストラクタ内で)に必要と思われるものと、必要なときに必要となる追加のメモリが割り当てられます。
ベクターが破壊されると(範囲外になったり、プログラムが終了したり、手動で削除されたりすると)、内部的に割り当てられたすべてのメモリが削除されます。
ベクトルのデストラクタは、プログラムが終了する前に呼び出されます。
ベクトルがオブジェクトへのポインタを保持している場合、それらのデストラクタは呼び出されませんが、ほとんどのプラットフォームでは、プログラムによって割り当てられたすべてのメモリは、プログラムの終了時に解放されます。
あなたが
new
を使用して、問題の事を割り当てなかった場合、私はそれに続い決してコールdelete
、削除操作
を使用する必要があります。
または静的ベクトルでデストラクタを呼び出しますか?
あなたがplacement- new
を使用して、場所ではありません再初期化事をした場合は、は明示的にデストラクタを呼び出すことはありませんが。
new
を自分でplacement-使用する必要はありませんすることはほぼ確実である。)
グローバル変数は、クリーンアップを取得しますプログラム終了時に自動的に
静的ベクトルの意味がわかりません。 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();
良いルールは以下のとおりです。
新しい、あなたはまた、削除したこと。
ベクターで使用されている配列を新規作成していないので、削除する必要はありません。
'あなたはそれらを削除する責任も負うでしょう。 - >提案された追加:その気になるものを安全にするために...;) –
hehe ..動的に割り当てられたポインタを格納する私のコード例は、あなたがnew.dのメモリを保存すると、v.clear()を呼び出すときにvectorクラスがあなたのためにdeleteを呼び出さないという点を説明する良いデザインです。 –
- 1. 静的を指すローカルポインタを削除する必要があります
- 2. C#LINQターゲットは静的である必要があります
- 3. ラムダを静的にする必要がありますか?
- 4. RouteConfig.csは静的クラスにする必要があります
- 5. 私的静的メソッドの必要性はありますか?
- 6. イベントハンドラを削除する必要がありますか?
- 7. Elasticsearchエイリアスを削除する必要がありますか?
- 8. 仮想インデックスを削除する必要がありますか?
- 9. OOP - 投稿を削除する必要がありますか?
- 10. System.Windows.Media.Penを削除する必要がありますか?
- 11. ラムダを削除する必要がありますか?
- 12. GLSurfaceViewでテクスチャを削除する必要がありますか?
- 13. QUpdSocketsを削除する必要がありますか?
- 14. ウェブサイトからプリローダーを削除する必要があります
- 15. CameraCaptureUIからStorageFileを削除する必要があります
- 16. 不要なスペースエレメントを削除する必要があります
- 17. ポーリングクラスを静的にする必要があります
- 18. deinitでUIGestureRecognizerを削除する必要はありますか?
- 19. 子コンテキストを削除する必要はありますか?
- 20. NSObjectでオブザーバを削除する必要はありますか?
- 21. 静的な値はSQLグループ内にある必要がありますか?
- 22. ファサードパターンのファサードクラスは静的である必要がありますか?
- 23. Androidのアダプターは、静的内部クラスまたは非静的内部クラスである必要があります
- 24. 静的メソッドはJavaでオーバーライドする必要がありますか?
- 25. すぐに削除する必要があります
- 26. 大きなファイルを削除する必要があります
- 27. バッチファイルを削除する必要があります
- 28. Android Studioでキャッシュを削除する必要があります
- 29. my_sql、1行目を削除する必要があります
- 30. sed&protobuf:ドットを削除する必要があります
ローカル変数が有効範囲外になると、そのデストラクターが自動的に呼び出されます。 'std :: vector'のデストラクタは、存在するときにローカルの' std :: vector'オブジェクトによって内部的に割り当てられた動的メモリを解放します。グローバルオブジェクトのデストラクタは、プログラムが終了する前に同様に呼び出されます。 – lapk
"静的ベクトル"のコード例を提供してください。 'static'はC++の多くのことを意味します。 –