Visual C ++:可能限制堆大小?

时间:2011-04-07 08:19:19

标签: c++ windows memory-management heap crt

我正在调试的应用程序有问题。稳态内存使用量是几百兆字节。偶尔(几个小时后)它进入一种状态,其内存使用量飙升至数千兆字节。我希望能够在发生内存使用时立即停止该程序。

在控件通过我自己的代码的地方,我可以使用这样的代码来捕获过多的内存:

bool usingTooMuchMemory()
{
    PROCESS_MEMORY_COUNTERS pmc;
    if (GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof pmc))
        return pmc.WorkingSetSize > 0x80000000u; // 2GB working set
    return false;
}

这对我没有帮助,因为我需要在正确的位置测试工作集大小。我真的希望程序在第一个mallocnew上中断,它使工作集或堆大小超过某个阈值。理想情况下,我希望CRT堆本身能够以最小的开销完成这项任务,因为该库喜欢分配大量的小块。

可疑代码位于由我的调用代码创建的线程中运行的DLL中。 DLL静态链接到CRT并且没有特殊的堆管理。我有DLL的源代码。

有什么想法吗?我错过了一些明显的东西吗?

3 个答案:

答案 0 :(得分:4)

您可以使用_CrtSetAllocHook设置内存分配和取消分配挂钩。

答案 1 :(得分:1)

您可以使用Detours库挂接HeapAlloc函数,内部调用malloc。

答案 2 :(得分:1)

http://msdn.microsoft.com/en-us/library/aa366778%28v=vs.85%29.aspx

如果在VS的链接器选项中清除IMAGE_FILE_LARGE_ADDRESS_AWARE标志,则程序的堆大小将限制为2GB,并且如果尝试获取将超过该限制的内存,则应该崩溃。