Поведение 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 освободить память.

Вот ссылка, которая объясняет это.

Другие вопросы по тегам