次の点を考慮してください。
char* msg = new char[20];
msg[4] = '\0';
delete[] msg;
delete[] msg
に割り当てられた 20 文字すべての割り当てを解除しましたか、それともmsg
までの文字だけ\0
ですか?- までしか割り当て解除されていない場合
\0
、メモリのブロック全体を強制的に削除するにはどうすればよいですか?
次の点を考慮してください。
char* msg = new char[20];
msg[4] = '\0';
delete[] msg;
delete[] msg
に割り当てられた 20 文字すべての割り当てを解除しましたか、それともmsg
までの文字だけ\0
ですか?\0
、メモリのブロック全体を強制的に削除するにはどうすればよいですか?delete
withを使用していたため、質問の元のコードには未定義の動作がありましたnew[]
。
delete
を次のように置き換えて修正したことに気付きましたdelete[]
。
delete[] msg;
これは正しく、によって割り当てられたすべてのメモリの割り当てを解除しますnew[]
。
\0
「まで削除」やその他の「部分的な」削除の概念はありません。/で割り当てられた完全なブロックのみを削除できるため、コードは問題ありません。new
new[]
オペレーターは、メモリーのdelete[]
ブロック全体を削除します。メモリ ブロックの一部を解放することはできません。ブロック全体のみを解放できます。
new/delete
、 、も同様ですmalloc/free
。割り当て解除関数は、メモリ ブロック全体の割り当てのみを解除できます。
delete[]
配列を解放するために使用する必要があります。これが、配列情報を探して配列全体を解放できるようにプログラムに指示できる唯一の方法です。
通常delete
の場合、コンパイラは、単一のポインターのみの割り当てを解除したいと考える場合がありますが、これは当てはまりません。配列のサイズに関する追加情報と、検索されないものと余分なメモリは解放されません。
配列内に char を設定し\0
ても違いはありません。配列を解放するときは、配列の既知のサイズのみが考慮されます。それ以外の場合は、
Class *array = new Class[50];
array[0] = NULL;
delete[] array;
メモリリークするだけです。