2009-02-02 6 views
5

Windows HeapFree, msvcrt free: ¿causan que la memoria se libere para ser localizada? Estoy tratando de estimar si no liberar la memoria en la salida aceleraría significativamente el cierre de la aplicación.¿Las rutinas de desasignación de memoria tocan la liberación del bloque?

NOTA: Esta es una pregunta técnica muy específica. No se trata de si las aplicaciones deben o no deben llamar al free en la salida.

+0

Pregunta muy interesante. Espero que alguien pueda responderlo. Por cierto, ¿has intentado preguntar en los foros de MSDN? –

+0

Creo que debería haber publicado la edición como una respuesta. ¡Buen trabajo! –

Respuesta

1

Ejecuté una prueba para HeapFree. El siguiente programa tiene acceso violación dentro HeapFree en i = 31999:

#include <windows.h> 

int main() { 

    HANDLE heap = GetProcessHeap(); 
    void * bufs[64000]; 

    // populate heap 
    for (unsigned i = 0; i < _countof(bufs); ++i) { 
     bufs[i] = HeapAlloc(heap, 0, 4000); 
    } 

    // protect a block in the "middle" 
    DWORD dwOldProtect; 
    VirtualProtect(
     bufs[_countof(bufs)/2], 4000, PAGE_NOACCESS, 
     &dwOldProtect); 

    // free blocks 
    for (unsigned i = 0; i < _countof(bufs); ++i) { 
     HeapFree(heap, 0, bufs[i]); 
    } 
} 

la pila es

[email protected]() + 0x12b9 bytes 
[email protected]() + 0x91f bytes 
shutfree.exe!main() Line 19 C++ 

Así que parece que la respuesta es "Sí" (esto se aplica a free así, ya que utiliza HeapFree internamente)

0

Estoy casi seguro de que la respuesta a la pregunta de mejora de velocidad sería "sí". Liberar un bloque puede o no tocar el bloque real en cuestión, pero sin duda tendrá que actualizar otra información de contabilidad en cualquier caso. Si tienes un montón de pequeños objetos asignados (sucede), entonces el esfuerzo requerido para liberarlos podría tener un impacto significativo.

Si puede organizarlo, puede intentar configurar su aplicación de manera que si sabe que se va a cerrar, guarde cualquier trabajo pendiente (configuración, documentos, lo que sea) y salga desagradablemente.

+0

Claro, no llamar a alguna función es más rápido que llamarlo :) Pero la pregunta no era sobre esto, sino sobre los detalles de Heap Manager. El exceso de velocidad es solo contexto. – Constantin

4

Si no desasigna limpiamente todos sus recursos en el cierre de la aplicación, será casi imposible detectar si tiene problemas realmente graves, como pérdidas de memoria, lo cual sería más un problema que un cierre lento . Si la IU desaparece rápidamente, el usuario pensará que se ha apagado rápidamente, incluso si todavía tiene mucho trabajo por hacer. Con UI, la percepción de velocidad es más importante que la velocidad real. Cuando el usuario selecciona la opción 'Salir de la aplicación', la ventana principal de la aplicación debe desaparecer inmediatamente. No importa si la aplicación tarda unos segundos después de eso para liberar todo de una salida con gracia, el usuario no se dará cuenta.

+0

Primero, no mencioné ninguna UI. La pregunta es general. En segundo lugar, las fallas de página afectan a todo el sistema, no solo a la aplicación que las causa. Por lo tanto, la imagen que se perciba será que la aplicación desaparecerá de la pantalla y luego el HDD comenzará a pulirse mientras que el SO resuelve fallas de página innecesarias. – Constantin

Cuestiones relacionadas