Самый большой недостаток, который я могу придумать, это то, что вы не можете явно вызвать delete
или delete []
для указателя, который был выделен с использованием malloc()
без вызова неопределенного поведения.Если вы собираетесь пойти по крайне нерекомендованному пути и использовать malloc()
для явного выделения памяти для объектов C ++, то вам все равно придется вызывать placement new
, чтобы правильно вызвать конструктор для инициализации выделенной области памятина malloc()
.Без оболочки operator new
на malloc()
вам также придется проверить, чтобы убедиться, что вы не получите возвращаемое значение NULL
, и создать некоторый код для обработки случаев, когда вы делаете это без использования исключения.Это также очень опасно и может привести к ряду неопределенных действий, если вы просто попытаетесь использовать функции библиотеки C, такие как memcpy()
, для копирования объектов C ++ в кучную память, выделенную с помощью malloc()
.
Более того, поскольку вы использовали placement new
для создания своего объекта, вам придется явно вызывать деструкторы для ваших динамически размещаемых объектов, а затем явно вызывать free()
для указателей.Это снова может вызвать всевозможные проблемы, если это не обрабатывается правильно, особенно если вы хотите работать с полиморфными типами и виртуальными базовыми классами.
Если вы собираетесь работать только с malloc()
и free()
Хорошее эмпирическое правило, позволяющее избежать неопределенных ловушек поведения, заключается в том, чтобы сохранить объекты, которые вы выделяете и освобождаете с malloc()
и free()
для POD-типов.Это означает, что неполиморфные структуры или классы не имеют пользовательских конструкторов, деструкторов, конструкторов копирования, операторов присваивания, частных / защищенных нестатических членов-данных или базовых классов, а также всех нестатических членов-данныхstruct / class сами являются POD-типами.Поскольку POD-типы в основном являются структурами в стиле C (но с дополнительной возможностью определять нестатические методы и указатель this
), вы можете безопасно выполнять управление памятью в стиле C с ними.