Есть ли принципиальная разница между malloc и HeapAlloc (кроме переносимости)?
У меня есть код, который по разным причинам я пытаюсь перенести из среды выполнения C на тот, который использует Windows Heap API. Я столкнулся с проблемой: если я перенаправить malloc
/calloc
/realloc
/free
звонки в HeapAlloc
/HeapReAlloc
/HeapFree
(с GetProcessHeap
для дескриптора) память, кажется, выделена правильно (не возвращен неверный указатель и не выданы исключения), но портируемая мной библиотека говорит "не удалось выделить память" по какой-то причине.
Я пробовал это как с Microsoft CRT (который использует API кучи), так и с библиотекой времени выполнения другой компании (которая использует API глобальной памяти внизу); malloc для обоих из них хорошо работает с библиотекой, но по какой-то причине использование Heap API напрямую не работает.
Я проверил, что выделения не слишком велики (>= 0x7FFF8 байт), и это не так.
Единственная проблема, о которой я могу думать, это выравнивание памяти; это тот случай? Или, кроме этого, есть ли принципиальная разница между API кучи и API памяти CRT, о которой я не знаю?
Если так, то, что это? А если нет, то почему статический Microsoft CRT (входит в состав Visual Studio) предпринимает некоторые дополнительные шаги в malloc
/calloc
перед звонком HeapAlloc
? Я подозреваю, что есть разница, но я не могу думать о том, что это может быть.
Спасибо!
2 ответа
Как я выяснил трудный путь...
Разница не принципиальная, но HeapReAlloc
(который использует RtlReAllocateHeap
) автоматически не обрабатывает нулевой указатель как подсказку для вызова HeapAlloc
; это терпит неудачу вместо этого.
Еще одно важное отличие:
void *ptr = NULL;
HeapFree(GetProcessHeap(), 0, ptr);
имеет неопределенное поведение, в то время как
void *ptr = NULL;
free(ptr);
четко определено ( операция не выполняется).