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

我正在debugging一个应用程序的问题。 稳态内存使用量是几百兆字节。 偶尔(几个小时后),它进入一个状态,内存使用量猛增到几千兆字节。 我希望能够尽快停止程序内存使用情况发生。

在控制权通过我自己的代码,我可以捕获过多的内存使用这样的代码:

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

这不能帮助我,因为我需要在正确的位置testing工作集大小。 我真的希望程序打破第一个mallocnew工作集或大小超过一定的阈值。 理想情况下,我希望CRT能够以最小的开销堆积起来,因为图书馆喜欢分配大量的小块。

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

有任何想法吗? 我错过了什么明显的?

您可以使用_CrtSetAllocHook来设置内存分配和释放挂钩。

您可以使用Detours库挂钩HeapAlloc函数,这是malloc在内部调用的函数。

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

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