Mam kod, który z różnych powodów próbuję przenieść z środowiska wykonawczego C do kodu korzystającego z interfejsu Windows Heap API. Napotkałem problem: Gdybym przekierowanie połączeń malloc
/calloc
/realloc
/free
do HeapAlloc
/HeapReAlloc
/HeapFree
(z GetProcessHeap
do klamki), pamięć wydaje się być poprawnie przydzielane (nie złe wskaźnik powrócił i żadnych wyjątków rzucony), ale biblioteka, którą przenosiłem, mówi "nie udało się przydzielić pamięci" z jakiegoś powodu.Czy istnieje zasadnicza różnica między malloc a HeapAlloc (oprócz możliwości przenoszenia)?
Próbowałem tego zarówno z Microsoft CRT (który korzysta z interfejsu API pod spodem), jak iz biblioteką uruchomieniową innej firmy (która korzysta z interfejsu Global Memory API pod spodem); malloc dla obu dobrze współpracuje z biblioteką, ale z jakiegoś powodu użycie API Heap bezpośrednio nie działa.
Sprawdziłem, czy alokacje nie są zbyt duże (> = 0x7FFF8 bajtów), a nie są.
Jedyny problem, jaki mogę sobie wyobrazić, to wyrównanie pamięci; czy tak jest? Czy może istnieje fundamentalna różnica między API Heap a API pamięci CRT, o których nie wiem?
Jeśli tak, co to jest? A jeśli nie, to dlaczego Microsoft CRT (dołączony do Visual Studio) podejmuje pewne dodatkowe kroki przed wywoływaniem? Podejrzewam, że jest różnica, ale nie mogę wymyślić, co to może być.
Dziękujemy!
HeapAlloc także nie przydzieli pamięci dla wskaźników o zerowej wielkości, w których miałaby być funkcja malloc. Ponadto, HeapAlloc nie mógł wywołać malloc, ponieważ prowadziło to do wywołań kolistych, gdyby nowy handler nie mógł naprawić problemu. – Necrolis
Ups, miałem literówkę; naprawiłem to, dzięki. – Mehrdad