Y at-il une différence fondamentale entre malloc et HeapAlloc (en dehors de la portabilité)?
Question
Je vais avoir un code qui, pour diverses raisons, je suis en train de le port du runtime C à celui qui utilise l'API Windows Heap. Je l'ai rencontré un problème: Si je Rediriger le malloc
/ calloc
/ realloc
/ free
appelle à HeapAlloc
/ HeapReAlloc
/ HeapFree
(avec GetProcessHeap
pour la poignée), la mémoire semble être alloué correctement (pas de mauvais pointeur retourné, et aucune exception jetée ), mais la bibliothèque, je suis le portage dit « pas allouer de la mémoire » pour une raison quelconque.
J'ai essayé cette fois avec le CRT Microsoft (qui utilise la sous API Heap) et avec la bibliothèque d'exécution de temps d'une autre société (qui utilise l'API mémoire globale en dessous); malloc pour les deux personnes fonctionne bien avec la bibliothèque, mais pour une raison quelconque, en utilisant l'API Heap ne directement fonctionne pas.
J'ai vérifié que les allocations ne sont pas trop grandes (> = 0x7FFF8 octets), et ils ne sont pas.
Le seul problème que je peux penser est l'alignement de la mémoire; est-ce le cas? Ou autre que cela, est-il une différence fondamentale entre l'API et l'API Heap mémoire CRT que je ne suis pas au courant?
Si oui, quel est-il? Et sinon, pourquoi le statique Microsoft CRT (inclus avec Visual Studio) prendre des mesures supplémentaires dans malloc
/ calloc
avant d'appeler HeapAlloc
? Je suis soupçonner qu'il ya une différence, mais je ne peux pas penser à ce qu'il pourrait être.
Merci!
La solution
Comme je l'ai appris à la dure ...
La différence est pas fondamentale, mais HeapReAlloc
(qui utilise RtlReAllocateHeap
) t pas traiter automatiquement un pointeur null comme un indice d'appel HeapAlloc
; il échoue à la place.
Autres conseils
Une autre différence importante:
void *ptr = NULL;
HeapFree(GetProcessHeap(), 0, ptr);
a comportement non défini , tandis que
void *ptr = NULL;
free(ptr);
est bien définie ( aucune opération effectuée ).