6

次の点を考慮してください。

char* msg = new char[20]; 
msg[4] = '\0'; 
delete[] msg; 
  1. delete[] msgに割り当てられた 20 文字すべての割り当てを解除しましたか、それともmsgまでの文字だけ\0ですか?
  2. までしか割り当て解除されていない場合\0、メモリのブロック全体を強制的に削除するにはどうすればよいですか?
4

3 に答える 3

10

deletewithを使用していたため、質問の元のコードには未定義の動作がありましたnew[]

deleteを次のように置き換えて修正したことに気付きましたdelete[]

delete[] msg;

これは正しく、によって割り当てられたすべてのメモリの割り当てを解除しますnew[]

\0「まで削除」やその他の「部分的な」削除の概念はありません。/で割り当てられた完全なブロックのみを削除できるため、コードは問題ありません。newnew[]

于 2012-12-03T17:26:46.093 に答える
5

オペレーターは、メモリーのdelete[]ブロック全体を削除します。メモリ ブロックの一部を解放することはできません。ブロック全体のみを解放できます。

new/delete、 、も同様ですmalloc/free。割り当て解除関数は、メモリ ブロック全体の割り当てのみを解除できます。

于 2012-12-03T17:28:15.783 に答える
1

delete[]配列を解放するために使用する必要があります。これが、配列情報を探して配列全体を解放できるようにプログラムに指示できる唯一の方法です。

通常deleteの場合、コンパイラは、単一のポインターのみの割り当てを解除したいと考える場合がありますが、これは当てはまりません。配列のサイズに関する追加情報と、検索されないものと余分なメモリは解放されません。

配列内に char を設定し\0 ても違いはありません。配列を解放するときは、配列の既知のサイズのみが考慮されます。それ以外の場合は、

Class *array = new Class[50];
array[0] = NULL;
delete[] array;

メモリリークするだけです。

于 2012-12-03T17:27:38.650 に答える