2010-07-06 3 views
12

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

В C++,

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

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

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

+0

related: http://stackoverflow.com/questions/1350819/c-free-store-vs-heap –

+1

Надеюсь, вы ответили на другие вопросы – ereOn

+7

«нет никакой разницы». -> Это технически правильно, обе точки приводят к неопределенному поведению, поэтому нет разницы :) – fredoverflow

ответ

14

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

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

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

1

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

т. Е. ЕСЛИ он работает, и нет никаких гарантий этого, то он, скорее всего, будет работать именно так, как требуется для базовых встроенных типов данных.

Смежные вопросы