内存释放例程是否触及正在释放的块?

时间:2009-02-02 10:02:14

标签: windows memory-management free msvcrt

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

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

3 个答案:

答案 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)

我几乎可以肯定速度提升问题的答案是“是”。释放块可能会或可能不会触及相关的实际块,但在任何情况下肯定都必须更新其他簿记信息。如果您分配了数以万计的小对象(它会发生),那么释放它们所需的努力可能会产生重大影响。

如果您可以安排它,您可以尝试设置您的应用程序,如果它知道它将要退出,保存任何待处理的工作(配置,文档,等等)并且不合理地退出。