новый, удалить, malloc и бесплатно - PullRequest
13 голосов
/ 06 июля 2010

Этот вопрос был задан мне в интервью:

В C ++,

  1. что если мы выделим память с помощью malloc и используем delete для освобождения этой выделенной памяти?
  2. что если мы выделим память с помощью new и освободим ее с помощью free?

С какими проблемами мы столкнемся, если в коде будут использованы вышеперечисленные вещи?

Мой ответ был: нет никакой разницы. Правильно ли я это сказал?

Ответы [ 2 ]

14 голосов
/ 06 июля 2010

Если вы сделаете это, вы столкнетесь с неопределенным поведением. Никогда не пытайся. Хотя new может быть реализовано через malloc(), а delete может быть реализовано через free(), нет гарантии, что они действительно реализованы таким образом и , также пользователь может перегрузить new и delete по своему усмотрению. Вы рискуете столкнуться с кучей коррупции.

Кроме этого, не забывайте, что когда вы вызываете malloc(), вы получаете необработанную память - конструктор не вызывается - и когда вы вызываете free(), деструктор не вызывается. Это также может привести к неопределенному поведению и неправильному функционированию программы.

Суть в том ... никогда не делай этого.

1 голос
/ 06 июля 2010

1) Неопределенное поведение, но, вероятно, будет "работать", хотя.Деструкторы будут вызваны при освобождении памяти, которую, вероятно, не хотят деконструировать.
2) Неопределенное поведение, но, вероятно, оно "сработает".Деструкторы НЕ будут вызываться.

то есть, если он работает, и нет гарантии, что он будет работать только так, как требуется для основных встроенных типов данных.

...