Можете ли вы безопасно использовать malloc в конструкторе класса C++ и использовать new для создания экземпляров этого объекта? Я знаю, что небезопасно использовать два в тандеме друг с другом при нормальных обстоятельствах, но в этом случае это возможно/безопасно?Использование новых с конструкторами C++, которые используют C malloc
ответ
Да, вы можете, но у вас должна быть веская причина. Оператор
new
вызывает конструктор, который во многом похож на обычный методclass
. Вы также должны добавить частьfree()
к деструктору.Но обратите внимание, что если вы
malloc()
a c++ объект, конструктор этого объекта не будет вызываться. Я думаю, что есть очень мало причин, чтобы позвонитьmalloc()
в программу c++: возможно, вы захотите ещеrealloc()
, что является одной из причин. Но вы всегда можете использовать собственные c++ объекты, такие как stl контейнеры.Это не опасно использовать два способа выделения памяти в программе c++, вы просто должны быть осторожны, чтобы не
malloc()
что-то, а затемdelete
это илиnew
что-то, а затемfree()
его. Но сmalloc()
вы ВСЕГДА должны быть осторожны во многих вещах, таких как возвращениеNULL
иfree()
в выделенную память, так что это не лишняя вещь.Еще раз, самое опасное, что вы можете сделать, это
malloc()
a c++ объект. Потому что, как я уже сказал, конструктор не будет вызван.
Вы ищете [размещение 'новый'] (http://en.cppreference.com/w/cpp/language/new)? –
Да, это работает: это ваш вопрос о некотором коде, который может выглядеть так: 'struct A {int * val; A(): val (malloc (sizeof (int)) {} ~ A() {free (val);}; A * = new A; – Franck
Я полагаю, что если конструктор содержит указатель на mallocated memory, а деструктор освобождает его, тогда нет проблем с созданным объектом, который выделяется с помощью 'new'. Это не совсем так, как обычно, но если вы сохраняете два набора проблем с распределением памяти, то вы должны быть в порядке Если вы ищете 'malloc()' объект в целом, то у вас есть проблемы - вы скрываетесь ни к чему. –