C++ visualc&x2B+;:可以限制堆大小吗?
我正在调试的应用程序有问题。稳态内存使用量为几百兆字节。偶尔(几个小时后),它会进入一种内存使用量飙升到千兆字节的状态。我想能够停止程序一旦内存使用发生这种情况 当控件通过我自己的代码时,我可以使用如下代码捕获过多的内存使用:C++ visualc&x2B+;:可以限制堆大小吗?,c++,windows,memory-management,heap,crt,C++,Windows,Memory Management,Heap,Crt,我正在调试的应用程序有问题。稳态内存使用量为几百兆字节。偶尔(几个小时后),它会进入一种内存使用量飙升到千兆字节的状态。我想能够停止程序一旦内存使用发生这种情况 当控件通过我自己的代码时,我可以使用如下代码捕获过多的内存使用: bool usingTooMuchMemory() { PROCESS_MEMORY_COUNTERS pmc; if (GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof pmc))
bool usingTooMuchMemory()
{
PROCESS_MEMORY_COUNTERS pmc;
if (GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof pmc))
return pmc.WorkingSetSize > 0x80000000u; // 2GB working set
return false;
}
这对我没有帮助,因为我需要在正确的点测试工作集大小。我真的希望程序在第一个malloc
或new
时中断,这会使工作集或堆大小超过某个阈值。理想情况下,我希望CRT堆本身以最小的开销完成这项工作,因为库喜欢分配大量的小块
可疑代码位于DLL中,该DLL运行在由调用代码创建的线程中。DLL静态链接到CRT,没有特殊的堆管理。我有DLL的源代码
有什么想法吗?我是否遗漏了一些明显的内容?您可以使用设置内存分配和释放挂钩。您可以使用库挂钩malloc内部调用的
HeapAlloc
函数。
如果清除VS的链接器选项中的IMAGE\u FILE\u LARGE\u ADDRESS\u AWARE标志,程序堆的大小将限制为2GB,如果试图获取超出该限制的内存,程序堆将崩溃 @sharptooth:如果您试图调试某些内容,在调试版本中使用它并不是不合理的。当然,只调试版本相对较慢,这限制了它们在需要处理大量数据时的使用。@sharptooth+1确实如此,但如果有一些适用于发布版本的内容,那就太好了。调试太慢了(是的,我知道打开优化会有一些帮助)。@paperjam:这是VC++运行时中唯一一种用于此目的的机制。您可以尝试启用优化并仍然链接到调试CRT。很好,但我猜这只适用于32位版本。只要明确清除该标志,在编译64位时也会存在2GB限制,因为默认情况下,该标志为x64目标设置,为x86目标清除。