Новый, удалить, malloc & free
Этот вопрос был задан мне в интервью:
В С++,
- что, если мы выделяем память с помощью
malloc
и используем delete
для освобождения выделенной памяти? - что, если мы выделим память с помощью
new
и освободим ее, используя free
?
Каковы проблемы, с которыми мы столкнулись бы, если в коде используются эти вещи?
Мой ответ был не разницы. Правильно ли я это сказал?
Ответы
Ответ 1
Если вы это сделаете, вы столкнетесь с поведением undefined. Никогда не пробуйте это. Хотя new
может быть реализовано с помощью malloc()
, а delete
может быть реализовано через free()
, нет гарантии, что они действительно реализованы таким образом, а также пользователь может перегрузить new
и delete
по своему усмотрению. Вы рискуете столкнуться с кучей.
Кроме этого не забывайте, что при вызове malloc()
вы получаете необработанную память - никакой конструктор не вызывается - и когда вы вызываете free()
, никакой деструктор не вызывается. Это также может привести к поведению undefined и неправильному функционированию программы.
Суть в том, что... никогда не делайте этого.
Ответ 2
1) Undefined, но, вероятно, "работает". Деструкторы будут вызваны в освобождаемую память, которая по-видимому не захочет быть деконструированной.
2) Undefined, но, вероятно, "работает". Деструкторы НЕ будут вызваны.
т.е. ЕСЛИ он работает, и нет гарантии этого, тогда он будет, скорее всего, работать именно так, как требуется для базовых встроенных типов данных.