Question

Windows HeapFree, msvcrt free: font-ils que la mémoire libérée soit paginée? J'essaie d'estimer que libérer la mémoire à la sortie accélérerait considérablement l'arrêt de l'application.

REMARQUE: Il s'agit d'une question technique très spécifique. Il ne s'agit pas de savoir si les applications doivent ou non appeler free à la sortie.

Était-ce utile?

La solution 2

J'ai effectué un test pour HeapFree. Le programme suivant contient une violation d'accès à l'intérieur de free à 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 pile est

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

On dirait donc que la réponse est & "Oui &"; (Ceci s'applique également à <=> puisqu'il utilise <=> en interne)

Autres conseils

Si vous ne désallouez pas proprement toutes vos ressources à l’arrêt de l’application, il sera presque impossible de détecter si vous rencontrez des problèmes très graves, comme des fuites de mémoire, qui poseraient davantage de problèmes que des arrêts lents. Si l’interface disparaît rapidement, l’utilisateur pensera qu’elle s’est fermée rapidement, même s’il a encore beaucoup à faire. Avec l'interface utilisateur, la perception de la vitesse est plus importante que la vitesse réelle. Lorsque l'utilisateur sélectionne l'option "Quitter l'application", la fenêtre principale de l'application doit immédiatement disparaître. Peu importe si l'application prend quelques secondes après cela pour libérer toutes les sorties, l'utilisateur ne le remarquera pas.

Je suis presque sûr que la réponse à la question d'amélioration de la vitesse serait & "oui &"; La libération d'un bloc peut toucher ou non le bloc en question, mais il faudra certainement mettre à jour les autres informations de comptabilité dans tous les cas. Si vous avez des zillions de petits objets alloués (cela arrive), alors l'effort requis pour les libérer tous pourrait avoir un impact significatif.

Si vous pouvez l'arranger, vous pouvez essayer de configurer votre application de telle sorte que, si elle sait qu'elle va se fermer, enregistrez tout travail en attente (configuration, documents, etc.) et quittez-le sans grâce.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top