Зачем использовать malloc / free, если у нас есть new / delete? - PullRequest
5 голосов
/ 02 апреля 2012

Какая польза от malloc и free, когда у нас есть new и delete в C ++. Я полагаю, функции обоих free и delete одинаковы.

Ответы [ 3 ]

8 голосов
/ 02 апреля 2012

Они не одинаковы. new вызывает конструктор, malloc просто выделяет память.

Кроме того, это неопределенное поведение смешивание двух (то есть использование new с free и malloc с delete).

В C ++ вы должны использовать new и delete, malloc и free для совместимости с C.

5 голосов
/ 02 апреля 2012

В C ++ редко бывает полезно использовать malloc & free вместо new & delete.

Один сценарий, который я могу придумать:

Если вы не хотите инициализировать вашу память неявными вызовами конструктора, и вам просто нужно гарантированное выделение памяти для размещения нового , тогда вполне нормально использовать malloc и free вместо new и delete.

С другой стороны, важно знать, что malloc и new не совпадают!
Два важных отличия:

  • new гарантирует вызов конструкторов вашего класса для инициализации членов класса, в то время как malloc этого не делает. Потребуется сделать дополнительные memset или связанные вызовы функций после malloc для инициализации выделил память, чтобы сделать что-то значимое.

  • Большим преимуществом является то, что для new вам не нужно проверять NULL после каждого выделения, просто включив обработчики исключений, вы сохраните лишнюю проверку ошибок в отличие от malloc.

3 голосов
/ 02 апреля 2012

Во-первых, когда вы говорите о 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().)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...