请注意我的英语水平很低。但我会尽力解释。
我在 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 项目是第一次包含,在这种情况下我只能看到这个问题)
有没有人想出解决这个问题的方法?
如果您想了解更多信息,请对本文发表评论。我会尽快回复
:它只发生在调试模式下。在发布模式下,不会发生此问题。