Поведение malloc с удалением в C++
int *p=(int * )malloc(sizeof(int));
delete p;
Когда мы выделяем память с помощью malloc, мы должны освободить ее с помощью free, а когда мы выделяем с помощью new в C++, мы должны освободить ее с помощью delete.
Но если мы выделяем память с помощью malloc, а затем используем delete, то должна быть какая-то ошибка. Но в приведенном выше коде нет ошибок или предупреждений в C++.
Кроме того, если мы изменим и разместим с помощью new и выпустим с использованием free, то также не будет ошибок или предупреждений.
Почему это так?
3 ответа
Это неопределенное поведение, так как нет способа надежно доказать, что память за указателем была выделена правильно (т.е. new
за delete
или же new[]
за delete[]
). Это ваша работа, чтобы такие вещи не происходили. Это просто, когда вы используете правильные инструменты, а именно умные указатели. Всякий раз, когда вы говорите delete
, ты делаешь это неправильно.
тогда должна быть какая-то ошибка
Есть. Это просто не обязательно очевидно.
Стандарт C++ (и стандарт C, на котором моделируется стандарт C++) называют этот тип ошибки неопределенным поведением. Под неопределенным они подразумевают, что может случиться что угодно. Программа может продолжаться в обычном режиме, она может сразу же аварийно завершить работу, она может выдать четко определенное сообщение об ошибке и изящно завершиться, она может начать отображать случайные ошибки через некоторое время после фактического неопределенного события поведения или вызвать носовые демоны.
Вы несете ответственность за предупреждение и устранение этих ошибок. Ничто не может предупредить вас, когда они случаются.
Использование free()
не delete
,
если ты malloc
тогда вам нужно позвонить free
освободить память.
если ты new
ты должен позвонить delete
освободить память.
Вот ссылка, которая объясняет это.