私は次の場合の違いを知っています:
case 1: int a[10];
ケース1の場合、配列のメモリはスタックに割り当てられます。
case 2: int *a = new int[10];
ケース2の場合、メモリはヒープに割り当てられ、ポインタが返されます。
しかし、ベクトルメモリは常にヒープに割り当てられるため、以下の2つの宣言の違いは何ですか?
vector<int> v1;
vector<int> *v2 = new vector<int>();
次の2つのステートメントは作成しますvector<>
が、2つの間にいくつかの違いがあります。
vector<int> v1;
vector<int> *v2 = new vector<int>();
まず、実際のベクターデータストレージは、ヒープまたは指定されたメモリアロケーターが使用するソースから割り当てられます(std :: vectorはどこでメモリを割り当てますか?を参照)。これは両方で同じです。
2つの違いは、(1)vector<>
管理データが格納される場所と、vector<>
およびその割り当てられたメモリの有効期間です。
最初のケースでは、vector<>
管理データはローカルメモリ、スタックに格納され、vector<>
変数がスコープ外になると、デストラクタが呼び出されて、ヒープ上のベクトルデータストレージスペースとスタック上のベクトル管理スペースが削除されます。最初のケースでは、vector<>
変数がスコープ外になると、vector<>
メモリが適切に解放されます。
2番目のケースでは、vector<>
ストレージデータスペースとvector<>
管理スペースの両方がヒープ上にあります。
したがって、のアドレスを含むポインタ変数vector<>
がスコープ外になると、vector<>
それ自体のデストラクタは呼び出されません。その結果、のデータストレージ領域vector<>
と管理ストレージ領域の両方に割り当てられたメモリをクリーンアップして解放するデストラクタが呼び出されないため、メモリは回復されません。
がvector<>
適切にクリーンアップされていることを確認する2番目のケースの1つの可能性は、スマートポインターを使用することです。これは、スコープ外になると、ポイントされたもののデストラクタもトリガーします。
ほとんどの場合、new
を作成するために使用する2番目のケースが必要になることvector<>
はまれであり、最初のケースが最も一般的であるだけでなく、より安全です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加