новый против нового (с участием malloc!) - PullRequest
2 голосов
/ 22 сентября 2011

В C ++ стандартно всегда использовать new сверх malloc(). Однако в этом вопросе наиболее переносимым способом перегрузки оператора new при исключении кода, специфичного для платформы, является вызов внутри него malloc() для фактического распределения.

При перегрузке вызываются конструкторы и сохраняется безопасность типов. Кроме того, вы можете отслеживать и контролировать распределение памяти.

Мой вопрос, при использовании в этом качестве, есть ли еще недостатки в использовании malloc() в C ++?

Ответы [ 3 ]

7 голосов
/ 22 сентября 2011

Если вы хотите переопределить new и delete, вам придется использовать malloc и free.Вот как это должно быть сделано.Не бойтесь.

Недостатки использования malloc() за пределами реализации new() остаются.

5 голосов
/ 22 сентября 2011

Самый большой недостаток, который я могу придумать, это то, что вы не можете явно вызвать 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 с ними.

3 голосов
/ 22 сентября 2011

Вы сами заявили ... Недостатком использования malloc / free непосредственно в коде C ++ является то, что конструкторы и деструкторы не будут запускаться;использование new / delete обеспечивает запуск конструкторов и деструкторов.Тем не менее, нет ничего плохого в косвенном использовании malloc через операторы new / delete.

...