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!
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
Vaya, tuve un error tipográfico; lo arreglé, gracias. – Mehrdad