请注意我的英语水平很低。但我会尽我所能解释。
VC2008 C++内存泄漏
我在Visual Studio 2008 sp1中制作了一个mfc项目。
该项目包括,到2008年/ SP1 /原生C++
问题maked静态库是步:
1)建立和MFC项目开始调试
2)单击X按钮在主窗口或alt + f4退出程序
3)主窗口一次关闭
4)但是当我查看taskmgr的进程选项卡时,它仍然活着。
5)如果我尝试杀死taskfr上的mfc项目进程,它立即死亡
6)但visual studio仍在调试模式,并且很长一段时间花在IDE上正常返回。
7)时间为5〜10分钟
8)输出日志,检测到内存泄漏!!
9)日志是非常大的,几乎11megabytes文本
,我发现这一点。
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);
}
}
//这个代码是我的静态库,使用游戏的物理引擎。
并且问题在于何时销毁这个instace。
当删除操作符调用(在程序结束时),它需要很长时间。
当我除去
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 ::列表<DWORD>
这个成员变量似乎不会造成内存泄漏。 (因为这个容器没有堆分配的任何关系)
和包括这个库的其他项目没有这个问题。
(但包括由mfc项目是第一次,我可以看到在这种情况下只有这个问题)
有没有人想象一个解决方案的问题?
如果您想了解更多信息,请对本文发表评论。我会尽快答复
更多:它只发生在DEBUG模式。在发布模式下,不会发生此问题。
请修复您的代码片段。删除'
'标签,突出显示您的代码,然后单击“代码片段”按钮(它看起来像一对大括号'{}')或按Ctrl + K **。另外,请确保在每个片段之前和之后留出空白行。 –
Adam Rosenfield /感谢通知{}按钮。 – user1006322
VS明显挂起,因为它的检测内存泄漏。泄漏不是由保存DWORD的'std :: list'引起的,但它们依赖于'MAX_OBJECT_NUMBER'。那么,还有谁正在使用'MAX_OBJECT_NUMBER'作为限制?必须有一些与'm_objAvaliable'相关的对象,它们可能没有正确释放,但是如果没有看到代码,我们就无法判断。 – eran