VC2008 C ++内存泄漏

时间:2011-10-21 02:41:09

标签: c++ mfc heap memory-leaks alloc

请注意我的英语技能很低。但我会尽力解释。


我在Visual Studio 2008 sp1中创建了一个mfc项目。

此项目包含一个由2008 / sp1 / native C ++

制作的静态库 问题是步骤:

1)在mfc项目上构建并启动调试
2)单击主窗口上的x按钮或alt + f4退出程序
3)主窗口立即关闭 4)但是当我查看taskmgr的进程选项卡时,它仍然存在。
5)如果我尝试在taskmgr上杀死mfc项目进程,它立即被杀死了 6)但是visual studio仍然处于调试模式并且很长时间才能恢复正常的IDE 7)时间为5~10分钟 8)并输出日志,检测到内存泄漏!!
9)日志非常大,几乎是11兆字节的文字


我发现了这一点 1)静态库总是在启动时使用new运算符创建库的主要功能类的实例(启动是静态时间,主要的前面)
2)静态库的构造函数有下一个代码
注意:对不起,我试着在这个编辑器中查找“代码”选项卡,但我无法创建代码部分,所以我编写代码并订购“br”html标签。


VPHYSICS::VPHYSICS(){
       m_tickflowed = 0;
       QueryPerformanceFrequency(&cpu_freq);
       SetTickTime(30);

       m_state[VPHYSTATE_SPEED_MAX]=SPEED_SCALAR_MAX;
       m_state[VPHYSTATE_LIMITED_ACCELARATION]=FALSE;
       m_state[VPHYSTATE_FRICTIONENABLE]=TRUE;
       m_state[VPHYSTATE_FRICTIONFACTOR]=1.0f;
       m_state[VPHYSTATE_GRAVITY]=9.8065f;
       m_state[VPHYSTATE_ENGINESPEED_DELAY_HIGH]=0.0f;
       m_state[VPHYSTATE_ENGINESPEED_DELAY_LOW]=0.0f;
       m_state[VPHYSTATE_FRICTION_RATIO]=1.0f;
       m_state[VPHYSTATE_DIMENSION_GLOBAL]=2;
       m_state[VPHYSTATE_COLLISION_UNFRICTIONABLE]=TRUE;
       m_state[VPHYSTATE_PAULI_EXCLUSION_ENABLE]=TRUE;
       m_state[VPHYSTATE_PAULI_EXCLUSION_RATIO]=1.0f;
       m_state[VPHYSTATE_FRICTION_SMOOTHLY]=1.0f;
       m_state[VPHYSTATE_COLLHANDLER_OUTER]=TRUE;
       m_dwSuspendedCount=0;
       InitializeCriticalSection(&m_criRegister);
       InitializeCriticalSection(&cri_out);
       ZeroMemory(m_objs,sizeof(m_objs));
       m_bThreadDestroy=FALSE;
       m_hPhysicalHandle=0;
       m_nPhysicalThread1ID=0;
       m_nTimeMomentTotalCount=0;
       m_hGarbageCollector=0;
       m_nGarbageCollectorID=0;
       m_PhyProcessIterID=NULL;
       for(DWORD i = 1 ; i < MAX_OBJECT_NUMBER ; i++)
       {
           m_objAvaliable.push_back(i);
       }
  }

//这段代码是我的静态库,使用物理引擎游戏。

问题在于破坏这种情况 当删除操作员调用时(在程序结束时),需要很长时间 当我删除

for(DWORD i = 1 ; i < MAX_OBJECT_NUMBER ; i++)
    {
        m_objAvaliable.push_back(i);
    }

,或减少MAX_OBJECT_NUMBER(原来 #define MAX_OBJECT_NUMBER 100000 ,但我将其减少到5或10),'长时间'消失!!

'm_objAvaliable'的类型是 std :: list&lt; DWORD&gt;
这个成员变量似乎没有导致内存泄漏。 (因为这个容器没有任何堆分配关系)
包括这个库在内的另一个项目没有这个问题 (但是mfc项目包括第一次,在这种情况下我只能看到这个问题)
有谁想象解决问题??? 如果您想了解更多信息,请对本文发表评论。我会尽快回复
更多:它只发生在DEBUG模式下。在发布模式下,不会发生此问题。

1 个答案:

答案 0 :(得分:0)

我认为您遇到的问题实际上根本不是问题。 MFC使用它自己的new调试版本(在发布模式下,它使用常规的默认new)。 MFC这样做是因为它可以尝试并且有助于告诉您内存泄漏。

麻烦的是,我认为你在静态库中释放了对象之后,MFC决定转储它认为尚未正确释放的任何分配。鉴于你有这么多的对象,它花了很长时间将这些东西倾倒到控制台。

在一天结束时,MFC认为没有内存泄漏。

您的解决方案是:

  1. 使用DEBUG NEW停止MFC。删除MFC项目中#define new DEBUG_NEW的所有行。这种方法的缺点是,当然,如果你无意中造成了真正的内存泄漏,它就无法跟踪它们。

  2. 在静态库中进行某种初始化,去初始化功能。在MFC应用程序退出时调用取消初始化函数,在MFC开始遍历分配之前,它仍然认为存在。