Y at-il une différence fondamentale entre malloc et HeapAlloc (en dehors de la portabilité)?

StackOverflow https://stackoverflow.com/questions/4588660

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!

Était-ce utile?

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 ).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top