Во-первых, когда вы говорите о new
и delete
, я предполагаю, что вы имеете в виду выражения, а не функции operator new
и operator delete
.Выражения new
и delete
не относятся к malloc
и free
и управляют памятью только случайно;их основная роль заключается в управлении временем жизни объекта: выражение new
вызовет функцию operator new
для получения памяти, а затем вызовет конструктор;выражение delete
вызовет деструктор перед вызовом operator delete
, чтобы освободить память.По большей части объекты должны быть созданы , а не просто выделены , что означает использование исключительно выражений.
В некоторых редких случаях требуется разделитьвыделение и инициализация (создание);Реализация таких вещей, как std::vector
, является классическим примером, когда вы будете выделять множество объектов за один раз, но создаете только один за раз.В таких случаях вы будете использовать функцию operator
new
для размещения и новое размещение для инициализации;на другом конце вы будете явно вызывать конструктор (что-то вроде p->~T()
) для уничтожения и использовать функцию operator delete
для освобождения памяти.
От руки, я могу вспомнить только два случаягде вы будете использовать malloc
и free
в C ++.Первый - реализовать собственные замены функций ::operator new
и ::operator delete
.(Я часто заменяю глобальные ::operator new
и ::operator delete
версиями отладки, которые отслеживают распределение, размещают защитные зоны вокруг выделенной памяти и т. Д.) Другой случай - при взаимодействии с устаревшей библиотекой, написанной на C: если библиотека говоритпередать указатель на память, выделенную malloc
(потому что он сам освободится с помощью free
), или, что более часто, возвращает указатель на память, выделенную malloc
, которую вы, как ожидается, освободите, тогда вы должны использоватьmalloc
и free
.(Лучшие библиотеки будут предоставлять свои собственные функции выделения и освобождения, которые более или менее выполняют то, что делают операторы new
и delete
, но всегда будут такие вещи, как strdup()
.)