Есть ли принципиальная разница между malloc и HeapAlloc (кроме переносимости)? - PullRequest
7 голосов
/ 04 января 2011

У меня есть код, который по разным причинам я пытаюсь перенести из среды выполнения C на ту, которая использует Windows Heap API. Я столкнулся с проблемой: если я перенаправлю вызовы malloc / calloc / realloc / free на HeapAlloc / HeapReAlloc / HeapFreeGetProcessHeap для дескриптора), Кажется, память выделена правильно (не возвращен неверный указатель и не выданы исключения), но переносимая мной библиотека говорит «не удалось выделить память» по какой-то причине.

Я пробовал это как с Microsoft CRT (который использует API кучи ниже), так и с библиотекой времени выполнения другой компании (которая использует API глобальной памяти внизу); malloc для обоих из них хорошо работает с библиотекой, но по какой-то причине использование Heap API напрямую не работает.

Я проверил, что выделения не слишком велики (> = 0x7FFF8 байт), и они не очень.

Единственная проблема, о которой я могу думать, это выравнивание памяти; это тот случай? Или, кроме этого, есть ли принципиальная разница между API кучи и API памяти CRT, о которой я не знаю?

Если так, то что это? А если нет, то почему static Microsoft CRT (входит в состав Visual Studio) предпринимает некоторые дополнительные шаги в malloc / calloc перед вызовом HeapAlloc? Я подозреваю, что есть разница, но я не могу думать о том, что это может быть.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 04 января 2011

Как я выяснил трудный путь ...

Разница не принципиальна, но HeapReAlloc (которая использует RtlReAllocateHeap) делает не автоматически обрабатывать нулевой указатель как подсказку для вызова HeapAlloc; вместо этого это терпит неудачу.

0 голосов
/ 24 сентября 2018

Еще одно важное отличие:

void *ptr = NULL;
HeapFree(GetProcessHeap(), 0, ptr);

имеет неопределенное поведение , тогда как

void *ptr = NULL;
free(ptr);

четко определено ( операция не выполнена ).

...