0

重複の可能性:
delete []はどのようにしてオペランド配列のサイズを「認識」しますか?
C ++での削除は、削除するメモリ位置の数をどのように知るのですか?

私はそれがかなり単純な質問であることを知っていますが、この行の違い(もしあれば)についてはわかりません:

double * a = new double[100];
delete[] a;
delete a;
free ((void*)a);

まず、これらの呼び出し(それぞれが他の呼び出しなしで使用される)はすべて同じように機能し、sizeof(double)* 100バイトを解放しますか?2番目の質問に私を導きます、プログラムはどのように割り当てられたメモリのサイズを追跡しますか?たとえばa、関数へのポインタを送信した場合delete[]、関数内からこのポインタを送信すると、同じ量のメモリも解放されますか?

ありがとう

4

3 に答える 3

4

単純化しすぎた違いは次のとおりです。

delete[] a;

正しい。他のすべては正しくなく、未定義の動作を示します。

さて、実際には、私が毎日使用するすべてのコンパイラで、delete a;毎回正しいことを実行します。しかし、あなたはまだそれをすべきではありません。未定義動作は決して正しくありません。

呼び出しはおそらく現実のfree世界でも正しいことをしますが、それはあなたが解放しているものにデフォルト以外のデストラクタがないからです。たとえば、デストラクタを備えたクラスである何かを試みた場合free、それは間違いなく機能しません。デストラクタが呼び出されることはありません。

newこれは、 /deletemalloc/の大きな違いの1つです(唯一の違いではありません)free。前者はコンストラクタとデストラクタを呼び出しますが、後者はスペースの割り当てと割り当て解除を行います。

@Robが削除された投稿で言ったことを組み込む:

簡単なルールは次のとおりです。すべてのnew[]には1つのdelete[]が必要です。新しいものはすべて、1回だけ削除する必要があります。mallocには無料が必要です。ミックスアンドマッチは許可されていません。

削除する要素の数をどのように知るかという質問については、前の重複した質問に対するこの回答delete[]を参照してください。

于 2012-05-11T19:51:52.200 に答える
0

私が間違っている場合、誰かが私を訂正しますが、私が理解している限り、あなたは以前にを使用したときと使用した後にメモリをdelete割り当てたときに使用します。また、を使用してメモリを割り当てた場合に使用されます。 newdelete[]new Type[]freemalloc

削除解放に関するc++リファレンスを参照してください。

于 2012-05-11T19:56:49.330 に答える
0

doubleの配列に関しては、すべての形式の結果は同じです。割り当てられたすべてのメモリがシステムに返されます。free呼び出しと呼び出しの違いは次のとおりですdeletedelete[]

  • freeメモリのみを解放します(割り当てられたメモリのサイズはa、呼び出し時にメモリマネージャによって保存されましたnew
  • deleteメモリを解放する前に、割り当てられたオブジェクトのデストラクタを呼び出します
  • delete[]メモリを解放する前に、配列内の各要素のデストラクタを呼び出します

割り当てられたオブジェクトのデストラクタに、オブジェクトの存続期間中に割り当てられたファイルやソケット記述子などの他のメモリまたはシステムリソースを解放するクリーンアップコードが含まれている場合、この違いは重要です。

deleteデストラクタの内容に関係なく、単一のインスタンスおよびdelete[]オブジェクト/プリミティブの配列で常に使用することは、C++の良い習慣です。

于 2012-05-11T20:03:25.877 に答える