Выделение памяти в С++ методами C

Рейтинг: 2Ответов: 2Опубликовано: 17.01.2011

Я сейчас пишу код программы на C++, используя приемы С - так привычнее. То есть код очень близок к C программе, но собирается C++ компилятором. В частности, память под структуры выделяю функциями malloc, free вместо new, delete. Насколько это правильно и безопасно?

// Это C++

struct P { ... };

P *p = (P *)malloc(sizeof(P));

free(p);

Ответы

▲ 9Принят

Отлчия malloc/free от new/delete:

  • new/delete вызывает деструкторы, а malloc/free нет;

  • new/delete знает размер класса(меньше вероятность ошибиться), а malloc/free нет;

  • new/delete умеет аллоцировать массивы и при уничтожении вызывать деструкторы каждого элемента массива, а malloc/free нет;

Плюс к этому, раз уж есть с++ под рукой и нужны указатели на объекты, то почему бы не воспользоваться идиомами auto_ptr, smart_ptr, weak_ptr в подходящих случаях и забыть про геморой с кучей повторов free(p), часть из которых легко упустить из виду.

▲ 6

Если в структуре применяется ООП, так делать нельзя.

Если нет, то дело обстоит так:

  • new вычисляет размер структуры автоматически. malloc'у нужен sizeof и т.д.
  • malloc возвращает void * и надо обязательно делать преобразование типа. Не ня.
  • new автоматом вызывает конструктор (если имеется), delete - деструктор (аналогично, если есть). malloc/free просто оперирует с кусками памяти кучи. Выделяет/освобождает.
  • delete может быть перегружен. free - неа. Как и new/malloc.
  • new генерирует исключение, если памяти маловато, а malloc просто вернёт пустой указатель.
  • Для массивов new требует количество элементов, а malloc - количество памяти, в котором можно случайно ошибиться.
  • Однако, у new/delete нет такого оператора, аналогичного функции realloc.
  • new - оператор, free - функция =) Ну, это так, для полноты.

Если вас всё это устраивает - пользуйтесь =)