Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ visualc&x2B+;:可以限制堆大小吗?_C++_Windows_Memory Management_Heap_Crt - Fatal编程技术网

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目标清除。