2010-03-02 27 views
6

Mi entorno de desarrollo es VS2008, DX9, Windows XP. Intento agregar manejo de protección a la caja sin memoria. Cuando malloc devuelve NULL, coloque algunos recursos en el disco y los guardo en la memoria.Por qué malloc siempre devuelve NULL

Pero a veces, malloc siempre devuelve NULL, incluso si lanzo la mayoría de los recursos y el uso de la memoria de proceso y el tamaño de la VM es solo de 800 MB en el administrador de tareas.

Creo que utilizar malloc para asignar 88 bytes debería estar bien, donde el uso de la memoria de proceso es de solo 800 MB. Pero malloc siempre devuelve NULL.

¿Podría ser la fragmentación de la memoria? No se ve así, ya que el uso de la memoria de proceso no es demasiado.

alt text http://i.imagehost.org/0267/Snap2.jpg

+1

¿Nos puede mostrar algún código? –

+0

Exe fue lanzado y adjuntado por VS depurador. – Buzz

+0

void * AllocCRT (size_t size) { return malloc (tamaño); } Uso de memoria: 644,088 K Tamaño de VM: 671,064 K – Buzz

Respuesta

2

Usted mencionó la fragmentación de memoria y que sin duda sería mi primera conjetura. Intente descargar la aplicación this. Se llama Address Space Monitor, y debería poder mostrarle si se trata de un problema de fragmentación.

+1

Este monitor analizará el espacio de direcciones del proceso tal como lo ve el sistema operativo, mientras que 'malloc' en MSVC funciona a través de la API Heap de Windows. No asigna memoria directamente desde el sistema y no la devuelve directamente al sistema. Lo que significa que este Monior no podrá mostrarle nada. Para Monitores como ese, todo el montón del programa se vería como una sólida caja negra impenetrable de memoria asignada para siempre. – AnT

+0

@AndreyT: Creo que 'no te mostraré nada' es un poco fuerte. El montón de proceso utiliza el espacio de direcciones del usuario para que pueda ver cuándo se ha agotado; esto no significa necesariamente que malloc no podrá asignar memoria que el montón ya ha reservado. Lo que debería suceder es cuando hay espacio libre de direcciones que el montón debe poder reclamar si necesita asignar más memoria de la que ya ha reservado. –

2

Podría ser la fragmentación del espacio de direcciones virtuales. Una forma de verificar es llamar al HeapCompact(GetProcessHeap(), 0). Si eso libera suficiente memoria, entonces esa es la causa probable.

Otra causa similar sería iniciar desde el depurador; eso hace que Windows use el montón de depuración, que tiene un comportamiento de memoria realmente muy malo durante un largo período de tiempo. Para desactivar ese comportamiento, configure _NO_DEBUG_HEAP=1 en el entorno y ejecútelo.

0

Otra posibilidad es que pueda haber un error en su programa. Crees que estás pidiendo 88 bytes, pero tal vez estás pasando una variable no inicializada y pidiendo cientos de megabytes. O tal vez algo que hiciste anteriormente sobrepasó un buffer y corrompió el montón, causando que malloc() fallara para siempre después de eso.

Cuestiones relacionadas