Pergunta

Windows HeapFree, msvcrt livre: eles causam a memória que está sendo liberado para ser paginada-in? Eu estou tentando estimar se não libertar memória na saída iria acelerar desligamento do aplicativo significativamente.

NOTA: Esta é uma questão técnica muito específica. Não é sobre se as aplicações deve ou não chamar free na saída.

Foi útil?

Solução 2

Eu corri um teste para HeapFree. O programa a seguir tem violação de acesso dentro HeapFree no 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]);
    }
}

A pilha é

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

Portanto, parece que a resposta é "Sim" (isso se aplica a free, bem como, uma vez que utiliza HeapFree internamente)

Outras dicas

Se você não limpa desalocar todos os seus recursos no desligamento aplicativo que irá torná-lo quase impossível de detectar se você tiver quaisquer problemas realmente sérios - como vazamentos de memória - o que seria mais um problema do que uma fechado para baixo lento. Se a interface do usuário desaparece rapidamente, então o usuário vai pensar o que foi desligado rapidamente, mesmo se ele tem um monte de trabalho a fazer. Com UI, a percepção da velocidade é mais importante do que a velocidade real. Quando o usuário seleciona a opção 'Sair da Aplicação', a janela principal do aplicativo deve desaparecer imediatamente. Não importa se o aplicativo leva alguns segundos depois que liberar tudo uma saída graciosa, o usuário não vai notar.

Estou quase certo de que a resposta para a pergunta melhoria de velocidade seria "sim". Libertar um bloco pode ou não tocar no bloco real em questão, mas certamente terá que atualizar outras informações de registro em qualquer caso. Se você tem zilhões de pequenos objetos alocados (acontece), então o esforço necessário para libertá-los todos poderiam ter um impacto significativo.

Se você pode organizá-lo, você pode tentar configurar o seu aplicativo de tal forma que se sabe que vai sair, salvar qualquer trabalho pendente (configuração, documentos, qualquer que seja) e saia ungracefully.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top