2011-01-03 24 views
7

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!

Odpowiedz

3

jak znalazłem się na własnej skórze ...

Różnica jest zasadnicza, ale HeapReAlloc (który używa RtlReAllocateHeap) robi nie automatycznie traktować jako wskaźnik null nutą zadzwonić HeapAlloc; zamiast tego zawiedzie.

+1

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

+0

Ups, miałem literówkę; naprawiłem to, dzięki. – Mehrdad