5

Windows HeapFree、msvcrt free:它们是否会导致被释放的内存被分页?我试图估计在退出时不释放内存是否会显着加速应用程序关闭。

注意:这是一个非常具体的技术问题。这与应用程序是否应该free在退出时调用无关。

4

3 回答 3

4

如果您在应用程序关闭时没有干净地释放所有资源,那么几乎不可能检测到您是否有任何真正严重的问题 - 例如内存泄漏 - 这比缓慢关闭更成问题。如果 UI 很快消失,那么用户会认为它已经快速关闭,即使它还有很多工作要做。对于 UI,速度感知比实际速度更重要。当用户选择“退出应用程序”选项时,主应用程序窗口应立即消失。应用程序在此之后是否需要几秒钟才能优雅地释放所有内容并退出并不重要,用户不会注意到。

于 2009-02-02T10:34:43.513 回答
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内部使用)

于 2010-02-18T06:47:17.320 回答
0

我几乎可以肯定速度改进问题的答案是“是”。释放一个块可能会或可能不会触及有问题的实际块,但无论如何它肯定必须更新其他簿记信息。如果您分配了无数小对象(它发生了),那么释放它们所需的努力可能会产生重大影响。

如果你可以安排它,你可以尝试设置你的应用程序,如果它知道它会退出,保存所有待处理的工作(配置、文档等)并不正常地退出。

于 2009-02-02T10:17:01.630 回答