请注意我的英语技能很低 . 但我会尽力解释 .
我在Visual Studio 2008 sp1中创建了一个mfc项目 .
这个项目包括一个由2008 / sp1 / native C制作的静态库
问题是这一步:
1)在mfc项目上构建并启动调试
2)单击主窗口上的x按钮或alt f4退出程序
3)主窗口立即关闭
4)但是当我查看taskmgr的进程选项卡时,它仍然存在 .
5)如果我尝试在taskmgr上杀死mfc项目进程,它会立刻被杀死
6)但是visual studio仍然处于调试模式并且很长时间才能恢复正常 .
7)时间是5~10分钟
8)输出日志,检测到内存泄漏!!
9)日志非常大,几乎是11兆字节的文本
我找到了重点 .
1)静态库总是在启动时使用new运算符创建库's main functional class' s实例(启动是静态时间,主要的前面)
2)静态库的构造函数有下一个代码
注意:我'm sorry i try to looking the '代码' tab in this editor but i can' t制作代码部分所以我编写代码并订购"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),'long time'消失了!
'm_objAvaliable'的类型是 std::list<DWORD>
这个成员变量似乎不会导致内存泄漏 . (因为这个容器没有堆分配的任何关系)
而包含此库的其他项目没有此问题 .
(但是mfc项目包括第一次,在这种情况下我只能看到这个问题)
有谁想象一个问题的解决方案???
如果您想了解更多信息,请对本文发表评论 . 我会尽快回复
更多:它只发生在DEBUG模式下 . 在释放模式下,不会发生此问题 .
1 回答
我相信你遇到的问题实际上根本不是问题 . MFC使用它自己的
new
调试版本(在发布模式下,它使用常规,默认new
) . MFC这样做,所以它可以尝试并有助于告诉你有内存泄漏 .麻烦的是,我认为你在静态库中释放对象是在MFC决定转储任何它认为没有花费很长时间将这些东西倾倒到控制台的分配之后发生的 .
在一天结束时,MFC认为没有内存泄漏 .
您的解决方案是:
使用DEBUG NEW停止MFC . 删除MFC项目中
#define new DEBUG_NEW
的所有行 . 这种方法的缺点是,当然,如果您无意中创建了真正的内存泄漏,它就无法跟踪它们 .在静态库中进行某种初始化,去初始化功能 . 当MFC应用程序退出时,在MFC开始遍历分配之前,它仍然认为存在时,调用去初始化函数 .