Поведение 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.