2011-01-03 7 views
7

Tengo un código que, por varias razones, intento portar desde el tiempo de ejecución de C a uno que usa la API Heap de Windows. Me he encontrado con un problema: Si vuelvo a dirigir los malloc/calloc/realloc/free llamadas a HeapAlloc/HeapReAlloc/HeapFree (con GetProcessHeap para el mango), la memoria parece ser asignados correctamente (sin puntero no regresó, y no hay excepciones producidas), pero la biblioteca que estoy portando dice "no se pudo asignar memoria" por alguna razón.¿Existe una diferencia fundamental entre malloc y HeapAlloc (aparte de la portabilidad)?

He intentado esto con Microsoft CRT (que usa la API de Heap debajo) y con la biblioteca de ejecución de otra compañía (que usa la API de memoria global debajo); el malloc para ambos funciona bien con la biblioteca, pero por alguna razón, el uso de la API Heap directamente no funciona.

He comprobado que las asignaciones no son demasiado grandes (> = 0x7FFF8 bytes), y no lo son.

El único problema que puedo pensar es la alineación de la memoria; es ese el caso? O más que eso, ¿hay una diferencia fundamental entre la API Heap y la API de memoria CRT de la que no tengo conocimiento?

Si es así, ¿qué es? Y si no, ¿por qué el estático Microsoft CRT (incluido con Visual Studio) dar algunos pasos adicionales en malloc/calloc antes de llamar al HeapAlloc? Sospecho que hay una diferencia, pero no puedo pensar en qué podría ser.

¡Gracias!

Respuesta

3

Como ya he encontrado la manera dura ...

La diferencia no es fundamental, pero HeapReAlloc (que utiliza RtlReAllocateHeap) hace no tratan de forma automática un puntero nulo como una sugerencia para llamar HeapAlloc; falla en su lugar.

+1

HeapAlloc tampoco asigna memoria para punteros de tamaño 0, donde lo haría malloc. Además, HeapAlloc no pudo llamar a malloc, porque lleva a llamadas circulares si el nuevo controlador no pudo rectificar el problema – Necrolis

+0

Vaya, tuve un error tipográfico; lo arreglé, gracias. – Mehrdad

Cuestiones relacionadas