私はあなたがこのようにしなければならないことを知っています:
int * p;
p = new int[10];
//use array
delete [] p;
ここで私の質問は次のとおりです。明示的に述べられていないため、正しい量のメモリが解放される可能性はありますか? OS は、割り当てられたメモリとその開始アドレスを追跡しますか?
私はあなたがこのようにしなければならないことを知っています:
int * p;
p = new int[10];
//use array
delete [] p;
ここで私の質問は次のとおりです。明示的に述べられていないため、正しい量のメモリが解放される可能性はありますか? OS は、割り当てられたメモリとその開始アドレスを追跡しますか?
はい、OS (またはライブラリ) が追跡します。
メモリを割り当てると、OS はメモリに小さなヘッダーを作成します。これは通常、割り当てられたメモリの直前、つまり、数バイトだけわずかに低いアドレスにあります。
メモリを解放するときは、解放されたポインタを取得し、数バイトさかのぼって、割り当てられたサイズを含め、実際に割り当てられたものを記述する構造をチェックします。
ランタイム ライブラリは、割り当てられたメモリ ブロックを追跡します。によって返される初期ポインタが与えられると、ブロックの割り当てが正しく解除されることが保証されますnew
。
これは OS 自体に (理論的には) 実装できますが、通常はそうではありません。OS が追跡するのは、プロセス全体に割り当てられたページであり、このレベルの抽象化で割り当てられた個々のブロックではありません。
それは完全に実装に依存します。通常のmalloc()/ free()と同様に、前述のように、システムによって保存される追加情報が必要です。一般に、malloc()またはnew演算子を呼び出すと、ポインタが返される直前にメモリ内にヘッダー構造が設定されるため、後でfree()またはdelete演算子を呼び出すと、何が起きているかを把握できます。あなたがそれを手渡したメモリのブロックで。
実装にもよりますが、ランタイムライブラリはある種のメモリ割り当てテーブルを使って割り当てられたブロックを追跡していると思います。