Pregunta

Windows HeapFree, msvcrt free: ¿hacen que la memoria liberada sea paginada? Estoy tratando de estimar si no liberar memoria al salir aceleraría significativamente el cierre de la aplicación.

NOTA: Esta es una pregunta técnica muy específica. No se trata de si las aplicaciones deberían o no llamar a free al salir.

¿Fue útil?

Solución 2

Ejecuté una prueba para HeapFree. El siguiente programa tiene una infracción de acceso dentro de free 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

ntdll.dll!_RtlpCoalesceFreeBlocks@16()  + 0x12b9 bytes  
ntdll.dll!_RtlFreeHeap@12()  + 0x91f bytes  
shutfree.exe!main()  Line 19    C++

Entonces parece que la respuesta es " Sí " (esto también se aplica a <=>, ya que utiliza <=> internamente)

Otros consejos

Si no desasigna limpiamente todos sus recursos en el cierre de la aplicación, será casi imposible detectar si tiene algún problema realmente serio, como pérdidas de memoria, lo que sería más un problema que un apagado lento. Si la interfaz de usuario desaparece rápidamente, entonces el usuario pensará que se ha apagado rápidamente, incluso si todavía tiene mucho trabajo por hacer. Con la IU, la percepción de la 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 debería desaparecer inmediatamente. No importa si la aplicación tarda unos segundos después de eso en liberar todo y una salida con gracia, el usuario no lo notará.

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

Si puede organizarlo, puede intentar configurar su aplicación de modo que si sabe que va a salir, guarde cualquier trabajo pendiente (configuración, documentos, lo que sea) y salga sin gracia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top