C++;堆状态差 有一个大工程用C++编写的。 一些gui操作(单击按钮)分配2MB内存。 这不是内存泄漏,当然稍后会释放内存。 但我需要研究分配了哪些对象来减少内存分配大小

C++;堆状态差 有一个大工程用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;

所以我试着使用调试crt

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的?来自任务管理器?