C++;堆状态差 有一个大工程用C++编写的。 一些gui操作(单击按钮)分配2MB内存。 这不是内存泄漏,当然稍后会释放内存。 但我需要研究分配了哪些对象来减少内存分配大小
所以我试着使用调试crtC++;堆状态差 有一个大工程用C++编写的。 一些gui操作(单击按钮)分配2MB内存。 这不是内存泄漏,当然稍后会释放内存。 但我需要研究分配了哪些对象来减少内存分配大小,c++,windows,heap,allocation,application-verifier,C++,Windows,Heap,Allocation,Application Verifier,所以我试着使用调试crt OnBtnClick() { //breakpoint1 _CrtMemState s1; _CrtMemCheckpoint( &s1 ); //The logic itself _CrtMemDumpAllObjectsSince(&s1); _CrtMemState s2; _CrtMemCheckpoint( &s2 ); _CrtMemState s3;
OnBtnClick()
{
//breakpoint1
_CrtMemState s1;
_CrtMemCheckpoint( &s1 );
//The logic itself
_CrtMemDumpAllObjectsSince(&s1);
_CrtMemState s2;
_CrtMemCheckpoint( &s2 );
_CrtMemState s3;
if ( _CrtMemDifference( &s3, &s1, &s2) )
_CrtMemDumpStatistics( &s3 );
//breakpoint2
}
调试报告说只分配了400KB。
但是任务管理器中两个断点之间的进程内存增加了2MB
所以,创建的转储是无用的。你能解释一下rest内存分配在哪里吗?尝试一个简单的测试,创建一个重载的全局New和Delete操作符,将每个请求记录到一个文件中。您可以使用静态全局文件的状态打开/关闭日志记录。这将为您提供一个工具来记录您期望控制的每个内存分配 看来我已经找到了问题的原因 单击按钮时,创建了几个richedit窗口控件,并用数据填充。 Windows可能会绕过运行时分配内存。所以我们在dbgcrt报告中没有看到它的分配。 但当我关闭richedit句柄时,内存被成功释放 因此,我将尝试对所有按钮单击使用一个公共richedit
谢谢大家的帮助 下划线大写名称是保留的,在程序代码中组成自己的名称会使程序格式错误。@KerrekSB:除非它们是;这只会使您的程序不可移植。C库不会从操作系统请求为每个对象分配内存,因此它可能有一些未使用的内存“库存”。@MikeSeymour:谢谢,修复:-)您是如何计算gui操作以分配2MB的?来自任务管理器?