Speicherfreigabe Routinen Berühren der Block freigegeben werden?
-
20-08-2019 - |
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.
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.