Windows HeapFree,msvcrt free:它们会导致被释放的内存被分页吗?我试图估计如果不在退出时释放内存会显着加快应用程序关闭。
注意:这是一个非常具体的技术问题。这不是应用程序应该或不应该在退出时调用free
。
答案 0 :(得分:4)
如果你在应用程序关闭时没有干净地释放所有资源,那么它几乎不可能检测到你是否有任何真正严重的问题 - 比如内存泄漏 - 这将是一个问题而不是缓慢关闭。如果UI快速消失,那么用户会认为它已经快速关闭,即使它还有很多工作要做。使用UI,速度感知比实际速度更重要。当用户选择“退出应用程序”选项时,主应用程序窗口应立即消失。如果应用程序在此之后花费几秒钟来释放所有退出的优雅,用户将不会注意到,这无关紧要。
答案 1 :(得分:1)
我对HeapFree
进行了测试。以下程序在HeapFree
内的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]);
}
}
堆栈是
ntdll.dll!_RtlpCoalesceFreeBlocks@16() + 0x12b9 bytes
ntdll.dll!_RtlFreeHeap@12() + 0x91f bytes
shutfree.exe!main() Line 19 C++
所以看起来答案是“是”(这也适用于free
,因为它在内部使用HeapFree
答案 2 :(得分:0)
我几乎可以肯定速度提升问题的答案是“是”。释放块可能会或可能不会触及相关的实际块,但在任何情况下肯定都必须更新其他簿记信息。如果您分配了数以万计的小对象(它会发生),那么释放它们所需的努力可能会产生重大影响。
如果您可以安排它,您可以尝试设置您的应用程序,如果它知道它将要退出,保存任何待处理的工作(配置,文档,等等)并且不合理地退出。