30
int *p=(int * )malloc(sizeof(int));

delete p;

malloc を使用してメモリを割り当てる場合は free を使用して解放し、C++ で new を使用して割り当てる場合は delete を使用して解放する必要があります。

ただし、malloc を使用してメモリを割り当ててから delete を使用すると、何らかのエラーが発生するはずです。しかし、上記のコードでは、C++ で発生するエラーや警告はありません。

また、new を使用してリバースして割り当て、free を使用して解放しても、エラーや警告は発生しません。

なぜそうなのですか?

4

3 に答える 3

36

newこれは未定義の動作です。ポインターの背後にあるメモリが正しく ( fordeleteまたはnew[]forによって) 割り当てられたことを確実に証明する方法がないためdelete[]です。そのようなことが起こらないようにするのはあなたの仕事です。適切なツール、つまりスマート ポインターを使用すれば簡単です。あなたが言うときはいつでもdelete、あなたはそれを間違っています。

于 2012-06-01T16:40:31.513 に答える
13

その場合、何らかのエラーが発生するはずです

がある。それは必ずしも明らかではありません。

C++ 標準 (および C++ 標準がモデル化されている C 標準) は、この種のエラーをundefined behaviorと呼んでいます。未定義とは、何かが起こる可能性があることを意味します。プログラムは正常に続行するか、すぐにクラッシュするか、適切に定義されたエラー メッセージを生成して正常に終了するか、実際の未定義の動作イベントの後でランダム エラーを示し始めるか、鼻の悪魔を呼び出す可能性があります。

これらのエラーに注意して排除するのは、ユーザーの責任です。それらが発生したときに警告する保証はありません。

于 2012-06-01T16:55:39.300 に答える
5

使用しfree()ないでくださいdelete

メモリを解放mallocするために呼び出す必要がある場合。free

メモリを解放newするために呼び出す必要がある場合。delete

ここにそれを説明するリンクがあります。

于 2012-06-01T16:40:56.757 に答える