Malloc () против HeapAlloc () - PullRequest
       1

Malloc () против HeapAlloc ()

54 голосов
/ 22 ноября 2011

В чем разница между malloc () и HeapAlloc ()? Насколько я понимаю, malloc выделяет память из кучи, точно так же, как HeapAlloc, верно?

Так в чем же разница?

Спасибо!

Ответы [ 8 ]

76 голосов
/ 04 января 2012

На самом деле, malloc () (и другие функции кучи времени выполнения C) зависят от модуля, что означает, что если вы вызываете malloc () в коде из одного модуля (т.е. DLL), то вы должны вызывать free () в кодетот же модуль, или вы можете получить довольно серьезное повреждение кучи (и это было хорошо задокументировано).Использование HeapAlloc () с GetProcessHeap () вместо malloc (), включая перегрузку операторов new и delete для их использования, позволяет передавать динамически размещенные объекты между модулями и не беспокоиться о повреждении памяти, если память выделяется в кодеодин модуль и освобождается в коде другого модуля, как только указатель на блок памяти был передан внешнему модулю.

47 голосов
/ 22 ноября 2011

Вы правы, что они оба выделяют память из кучи. Но есть и отличия:

  • malloc() является портативным, часть стандарта.
  • HeapAlloc() не переносимый, это функция Windows API.

Вполне возможно, что в Windows malloc будет реализован поверх HeapAlloc. Я ожидаю, что malloc будет быстрее, чем HeapAlloc.

HeapAlloc обладает большей гибкостью, чем malloc. В частности, он позволяет указать, какую кучу вы хотите выделить. Это обслуживает несколько куч на процесс.

Почти для всех сценариев кодирования вы бы использовали malloc вместо HeapAlloc. Хотя вы отметили свой вопрос C ++, я ожидаю, что вы будете использовать new!

23 голосов
/ 11 апреля 2012

В Visual C ++ функция malloc() или оператор new в конечном итоге вызывает HeapAlloc().Если вы отладите код, вы обнаружите, что функция _heap_alloc_base() (в файле malloc.c) вызывает return HeapAlloc(_crtheap, 0, size), где _crtheap - глобальная куча, созданная с помощью HeapCreate().

ФункцияHeapAlloc() хорошо справляется с задачей минимизации накладных расходов памяти с минимальными накладными расходами 8 байт на выделение.Самое большое, что я видел, составляет 15 байтов на выделение, для выделений от 1 байта до 100000 байтов.Большие блоки имеют большие накладные расходы, однако в процентах от общего выделенного количества они остаются менее 2,5% полезной нагрузки.

Я не могу комментировать производительность, потому что я не сравнил HeapAlloc() с пользовательской процедурой,однако, что касается затрат памяти при использовании HeapAlloc(), они невероятно низкие.

6 голосов
/ 22 ноября 2011

malloc - это функция в стандартной библиотеке C (а также в стандартной библиотеке C ++).

HeapAlloc - это функция Windows API.

Последняя позволяет вам указатькуча для выделения, которую я представляю, может быть полезна для избежания сериализации запросов на выделение в разных потоках (обратите внимание на флаг HEAP_NO_SERIALIZE).

Cheers & hth.,

1 голос
/ 05 октября 2018

В системах, где несколько библиотек DLL могут приходить и уходить (через LoadLibrary / Freelibrary), и когда память может быть выделена в одной библиотеке DLL, но освобождена в другой (см. Предыдущий ответ), HeapAlloc и связанные функции представляются наименее распространенными-denominator для успешного совместного использования памяти.

Потокобезопасный, предположительно сильно оптимизированный докторами наук в большом количестве, HeapAlloc, похоже, работает во всех ситуациях, когда наш код, не предназначенный для совместного использования, использующий malloc / free, потерпит неудачу.

Мы являемся встроенным магазином C ++, поэтому мы перегружаем оператор new / delete в нашей системе, чтобы использовать HeapAlloc (GetProcessHeap ()), который может быть заглушен (на цели) или встроен (в окна) для переносимости кода.

Пока что нет проблем, когда мы обошли malloc / free, который, без сомнения, выглядит DLL специально, новая куча для каждой загрузки DLL.

1 голос
/ 24 марта 2017

Дополнительно вы можете обратиться к:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa366705(v=vs.85).aspx

Что означает, что вы можете включить некоторые функции HEAP, управляемые распределителем памяти WinApi, например, «HeapEnableTerminationOnCorruption».

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

(например, я бы предпочел аварийно завершить работу моего приложения (как владельца приложения), а не выполнять произвольный код)

Другое дело, что это может быть полезно на ранней стадии разработки, поэтому вы можете обнаружить проблемы с памятью, прежде чем приступить к работе.

0 голосов
/ 29 августа 2018

malloc - это экспортируемая функция библиотекой времени выполнения C (CRT), которая зависит от компилятора.
Имя DLL библиотеки времени выполнения C изменяется с версий Visual Studio на версии.

Функция HeapAlloc экспортируется ядром32.dll, присутствующим в папке Windows.

0 голосов
/ 19 октября 2012

Это то, что MS должна сказать по этому поводу: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366533(v=vs.85).aspx

Одна вещь, о которой упоминалось до сих пор, такова: «Функция malloc имеет тот недостаток, что она зависит от времени выполнения. Новый оператор имеетНедостаток зависимости от компилятора и от языка. "

Кроме того," HeapAlloc может быть вызвано исключение, если память не может быть выделена ""

Так что если вы хотите, чтобы ваша программа работала с любымCRT, или, возможно, вообще не CRT, вы бы использовали HeapAlloc.Возможно, только люди, которые будут делать такие вещи, будут авторами вредоносных программ.Другое использование может быть, если вы пишете приложение с очень интенсивным использованием памяти с определенными схемами распределения / использования памяти, для которых вы предпочитаете писать свой собственный распределитель кучи вместо использования CRT.

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