我在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模式下。在发布模式下,不会发生此问题。
答案 0 :(得分:0)
我认为您遇到的问题实际上根本不是问题。 MFC使用它自己的new
调试版本(在发布模式下,它使用常规的默认new
)。 MFC这样做是因为它可以尝试并且有助于告诉您内存泄漏。
麻烦的是,我认为你在静态库中释放了对象在之后,MFC决定转储它认为尚未正确释放的任何分配。鉴于你有这么多的对象,它花了很长时间将这些东西倾倒到控制台。
在一天结束时,MFC认为没有内存泄漏。
您的解决方案是:
使用DEBUG NEW停止MFC。删除MFC项目中#define new DEBUG_NEW
的所有行。这种方法的缺点是,当然,如果你无意中造成了真正的内存泄漏,它就无法跟踪它们。
在静态库中进行某种初始化,去初始化功能。在MFC应用程序退出时调用取消初始化函数,在MFC开始遍历分配之前,它仍然认为存在。