0

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


我在 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运算符(启动是静态时间,在main前面)
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<DWORD>
这个成员变量似乎不会导致内存泄漏。(因为这个容器没有任何堆分配关系)
和包括这个库的其他项目没有这个问题。
(但 mfc 项目是第一次包含,在这种情况下我只能看到这个问题)
有没有人想出解决这个问题的方法?
如果您想了解更多信息,请对本文发表评论。我会尽快回复
:它只发生在调试模式下。在发布模式下,不会发生此问题。

4

1 回答 1

0

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

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

归根结底,MFC 认为存在内存泄漏,而实际上没有。

您的解决方案是:

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

  2. 在静态库中有某种初始化、反初始化功能。在 MFC 应用程序退出时调用反初始化函数,在 MFC 开始搜索它仍然认为存在的分配之前。

于 2011-10-26T08:55:56.570 回答