web-dev-qa-db-ja.com

C ++での削除を伴うmallocの動作

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

delete p;

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

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

また、newを使用してリバースして割り当て、freeを使用してリリースする場合も、エラーや警告はありません。

なぜそうなのですか?

27
Luv

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

30
Cat Plus Plus

その後、いくつかのエラーがあるはずです

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

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

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

9
n.m.

deleteではなくfree()を使用してください。

mallocの場合、freeを呼び出してメモリを解放する必要があります。

newの場合、deleteを呼び出してメモリを解放する必要があります。

ここ はそれを説明するリンクです。

2
andre