C++ 使进程在大内存分配时崩溃

C++ 使进程在大内存分配时崩溃,c++,memory-leaks,visual-studio-2008-sp1,C++,Memory Leaks,Visual Studio 2008 Sp1,我试图找到一个严重的内存泄漏(一次15MB,但在多个位置执行类似的分配)。我检查了最明显的地方,然后用了一段时间,但我仍然不能确定它。现在我看到剩下的两个选项: 1) 使用SetProcessWorkingSetSize:我已经尝试过了,但是当使用超过150MB的内存时,我的进程仍能愉快地继续运行: DWORD MemorySize = 150*1024*1024; SetProcessWorkingSetSize( GetCurrentProcess(), MemorySize/2, Memo

我试图找到一个严重的内存泄漏(一次15MB,但在多个位置执行类似的分配)。我检查了最明显的地方,然后用了一段时间,但我仍然不能确定它。现在我看到剩下的两个选项:

1) 使用SetProcessWorkingSetSize:我已经尝试过了,但是当使用超过150MB的内存时,我的进程仍能愉快地继续运行:

DWORD MemorySize = 150*1024*1024;
SetProcessWorkingSetSize( GetCurrentProcess(), MemorySize/2, MemorySize*2 );

2) 在一次分配超过1MB的内存时设置断点。我该怎么做呢,在操作系统中重载新的操作符,并在其中加上一个“if>1MB”?

SetProcessWorkingSetSize并不是你所想的意思-它是操作系统的一个线索,告诉你“内存中”要保留多少内存,而不是分页到磁盘。现代操作系统在将未使用的内存分页到磁盘时非常具有攻击性,尤其是Windows

是除了非常彻底的代码分析之外的唯一解决方案。在Windows上,对于C/C++,没有更好的工具来查找内存泄漏。在Mac或Linux上,你可以使用valgrind,但实际上,它还不能在Windows上运行

1)使用SetProcessWorkingSetSize:我已经尝试过了,但当使用超过150MB时,我的进程仍能愉快地继续运行:

SetProcessWorkingSetSize返回什么?电话接通了吗

2)在一次分配超过1MB的内存时放置断点。我应该如何做到这一点,使用“if>1MB”内部重载新操作符?
是的,应该行


检查MSVC提供的工具可能会有所帮助。

在嵌入式类型系统上,我们会完全按照您的建议执行-将对new/memAlloc的任何调用的中断时间设置为高于某个阈值,并在free/delete上执行相同的操作。单调乏味,但它会使工作完成。大小上的条件断点应该满足您的要求,但在删除上,情况更糟。

尝试使用。它是一个免费的微软实用工具,它可以找到内存泄漏。

从你的标签中,你使用的是C++和VisualStudio.< 在这种情况下,您可以简单地使用Microsoft为您提供的crt调试挂钩

在msdn中搜索_CrtSetAllocHook


在调试构建中,这将允许您拦截每个分配-您可以忽略小的分配,只需在大的分配上设置断点或调用::DebugBreak。

对不起,所有建议的解决方案都不起作用。它最终通过AQTime和大量调试输出得到了修复。关闭时泄漏物被清理干净了,所以它是在大海捞针


不过我还是对如何有效地找到这个感兴趣。我试图在新运算符上设置一个条件断点,但调试器花了很长时间为每个分配计算“bytes>1024*1024”。

SetProcessWorkingSetSize成功,它返回非零。您从哪里获得15MB的数字?操作系统声称您的进程正在使用多少空间?很多时候,标准库会分配比您请求的内存更多的内存,并将剩余的内存保留到下一个新库中。例如,15K的1000次分配仍可能显示为一次泄漏15MB。