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

Con*_*tin 5 windows free memory-management msvcrt

Windows HeapFree,msvcrt free:它们是否会释放被释放的内存?我试图估计如果不在退出时释放内存将显着加快应用程序关闭.

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

Con*_*tin 1

我进行了测试HeapFree。以下程序在HeapFreei = 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]);
    }
}
Run Code Online (Sandbox Code Playgroud)

堆栈是

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

所以看起来答案是“是”(这free也适用,因为它HeapFree在内部使用)