Frage

Windows-HeapFree, msvcrt frei: Sie verursachen sie der Speicher ausgelagert-in werden wird befreit? Ich versuche, zu schätzen, wenn sie nicht befreit Speicher an der Ausfahrt erheblich beschleunigen würde das Beenden der Anwendung.

Hinweis: Dies ist eine sehr spezielle technische Frage. Es geht nicht darum, ob Anwendungen sollten oder nicht free an der Ausfahrt nennen.

War es hilfreich?

Lösung 2

lief ich einen Test für HeapFree. Das folgende Programm hat Zugriffsverletzung innerhalb HeapFree bei 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]);
    }
}

Der Stapel ist

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

So ist es wie die Antwort aussieht, ist „Yes“ (dies gilt auch für free, da es HeapFree intern verwendet)

Andere Tipps

Wenn Sie nicht sauber Sie alle Ihre Ressourcen auf das Beenden der Anwendung freigeben wird es nahezu unmöglich machen, um festzustellen, ob Sie wirklich ernsthafte Probleme haben - wie Speicherlecks - was eher ein Problem sein würde, als ein langsames Herunterfahren. Wenn die Benutzeroberfläche schnell verschwindet, dann wird denken, der Benutzer die es schnell heruntergefahren hat, auch wenn es viel Arbeit noch zu tun hat. Mit UI, Wahrnehmung von Geschwindigkeit ist wichtiger als die tatsächliche Geschwindigkeit. Wenn der Benutzer die ‚Anwendung beenden‘ Option wählt, sollte das Programmhauptfenster sofort verschwinden. Dabei spielt es keine Rolle, ob die Anwendung ein paar Sekunden, danach findet eine Ausfahrt anmutig zu befreien alles, wird der Benutzer nicht bemerken.

Ich bin fast sicher, die Antwort auf die Verbesserung der Geschwindigkeit Frage wäre: „Ja“. kann einen Block zu befreien oder nicht den tatsächlichen Block in Frage berühren, aber es wird sicherlich andere Buchhaltungsinformationen in jedem Fall zu aktualisieren. Wenn Sie Myriaden von kleinen Objekten zugeordnet (es passiert), dann ist der Aufwand, sie zu befreien alle wesentlichen Einfluss haben könnten.

Wenn Sie es ändern können, können Sie versuchen, Ihre Anwendung einrichten, so dass, wenn es weiß, es geht um alle ausstehenden Arbeiten zu beenden, zu speichern (Konfiguration, Dokumente, was auch immer) und Ausgang ungracefully.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top