malloc devuelve NULL y establece errno en ENOMEM, pero ¿hay mucho espacio de almacenamiento dinámico disponible?

Tengo una situación en la quemalloc() devolucionesNULL y estableceerrno aENOMEM. Pero el montón de CRT (que es cultivable) tiene mucha memoria para trabajar. En el momento demalloc, mi memoria de proceso es de aproximadamente 900 MB. El proceso de host es un ejecutable de Java ejecutado bajo Sun HotSpot JVM.

Losmalloc() Lo que estoy haciendo es de 80 megabytes, y falla. Si hago una asignación de 60 MB, tiene éxito. Después de eso, una asignación de 50 MB, seguida de otra y otratambién tiene éxito: claramente, todavía me queda mucha memoria, pero el malloc de 80 MB parece demasiado "grande" para digerir para el sistema operativo.

Estoy usando Windows 7 x64 SP1 con 4 GB de RAM. Mi proceso es un proceso de 32 bits, creado con VC ++ 2010 SP1. Estoy usando el montón de baja fragmentación, que es el predeterminado en Win 7; también lo he verificado con HeapQueryInformation. El VC2010 C Run-Time que estoy usando crea el montón de esta manera:

HeapCreate(0, BYTES_PER_PAGE, 0)

De acuerdo con la documentación deHeapCreate, HeapAlloc llamará automáticamente aVirtualAlloc para bloques de más de 512 KB.

Qué diablos puede causarmalloc() para fallar si esto no es una falta de memoria? ¿Mi memoria está demasiado fragmentada? Pensé que Windows compactaría el montón automáticamente. Esto es realmente extraño, nunca había visto este comportamiento antes.

Otra computadora con Windows XP SP3 de 32 bits exhibe el mismo comportamiento.

Gracias, Martin

Respuestas a la pregunta(0)

Su respuesta a la pregunta