Поведение malloc с удалением в С++

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

delete p;

Когда мы выделяем память с помощью malloc, мы должны ее освобождать, используя free, и когда мы выделяем с помощью new в С++, мы должны освободить его, используя delete.

Но если мы выделяем память с помощью malloc, а затем будем использовать delete, тогда должна быть некоторая ошибка. Но в приведенном выше коде нет ошибок или предупреждений, поступающих на С++.

Также, если мы отменим и выделим с помощью new и release, используя free, тогда также нет ошибки или предупреждения.

Почему это так?

Ответ 1

Это поведение undefined, так как невозможно надежно доказать, что память за указателем была правильно распределена (т.е. new для delete или new[] для delete[]). Это ваша работа, чтобы такие вещи не происходили. Это просто, когда вы используете правильные инструменты, а именно интеллектуальные указатели. Всякий раз, когда вы говорите delete, вы делаете это неправильно.

Ответ 2

тогда должна быть некоторая ошибка

Есть. Это не обязательно очевидно.

Стандарт С++ (и стандарт C, на котором моделируется стандарт С++) вызывает подобное поведение undefined. По undefined они означают, что что-то вообще может произойти. Программа может продолжаться в обычном режиме, она может немедленно сработать, она может создать четко определенное сообщение об ошибке и выйти изящно, она может начать проявлять случайные ошибки в течение некоторого времени после фактического события поведения undefined или вызвать носовых демонов.

Ваша ответственность - следить и устранять эти ошибки. Ничто не гарантирует вас, когда они произойдут.

Ответ 3

Используйте free() not delete.

если вы malloc, вам нужно вызвать free для освобождения памяти.

если вы new, вы должны вызвать delete для освобождения памяти.

Здесь - это ссылка, которая объясняет это.

Ответ 4

Попробуйте следующее:

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

int i =5;

p = &i;

delete p;

Это приведет к сбою. Поэтому представляется, что в современных компиляторах вы можете использовать delete с malloc, если вы не назначили что-либо памяти, выделенную malloc.