2016-08-28 3 views
3

Можете ли вы безопасно использовать malloc в конструкторе класса C++ и использовать new для создания экземпляров этого объекта? Я знаю, что небезопасно использовать два в тандеме друг с другом при нормальных обстоятельствах, но в этом случае это возможно/безопасно?Использование новых с конструкторами C++, которые используют C malloc

+0

Вы ищете [размещение 'новый'] (http://en.cppreference.com/w/cpp/language/new)? –

+1

Да, это работает: это ваш вопрос о некотором коде, который может выглядеть так: 'struct A {int * val; A(): val (malloc (sizeof (int)) {} ~ A() {free (val);}; A * = new A; – Franck

+2

Я полагаю, что если конструктор содержит указатель на mallocated memory, а деструктор освобождает его, тогда нет проблем с созданным объектом, который выделяется с помощью 'new'. Это не совсем так, как обычно, но если вы сохраняете два набора проблем с распределением памяти, то вы должны быть в порядке Если вы ищете 'malloc()' объект в целом, то у вас есть проблемы - вы скрываетесь ни к чему. –

ответ

7
  1. Да, вы можете, но у вас должна быть веская причина. Оператор new вызывает конструктор, который во многом похож на обычный метод class. Вы также должны добавить часть free() к деструктору.

    Но обратите внимание, что если вы malloc() a объект, конструктор этого объекта не будет вызываться. Я думаю, что есть очень мало причин, чтобы позвонить malloc() в программу : возможно, вы захотите еще realloc(), что является одной из причин. Но вы всегда можете использовать собственные объекты, такие как контейнеры.

  2. Это не опасно использовать два способа выделения памяти в программе , вы просто должны быть осторожны, чтобы не malloc() что-то, а затем delete это или new что-то, а затем free() его. Но с malloc() вы ВСЕГДА должны быть осторожны во многих вещах, таких как возвращение NULL и free() в выделенную память, так что это не лишняя вещь.

    Еще раз, самое опасное, что вы можете сделать, это malloc() a объект. Потому что, как я уже сказал, конструктор не будет вызван.

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

  • Нет связанных вопросов^_^