2011-10-21 202 views
0

请注意我的英语水平很低。但我会尽我所能解释。
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模式。在发布模式下,不会发生此问题。

+1

请修复您的代码片段。删除'
'标签,突出显示您的代码,然后单击“代码片段”按钮(它看起来像一对大括号'{}')或按Ctrl + K **。另外,请确保在每个片段之前和之后留出空白行。 –

+0

Adam Rosenfield /感谢通知{}按钮。 – user1006322

+0

VS明显挂起,因为它的检测内存泄漏。泄漏不是由保存DWORD的'std :: list'引起的,但它们依赖于'MAX_OBJECT_NUMBER'。那么,还有谁正在使用'MAX_OBJECT_NUMBER'作为限制?必须有一些与'm_objAvaliable'相关的对象,它们可能没有正确释放,但是如果没有看到代码,我们就无法判断。 – eran

回答

0

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

问题是,我认为你释放静态库中的对象正在发生 MFC已决定转储任何它认为未被正确释放的分配。鉴于你有这么多的东西,它花了很长时间把这些东西扔到控制台上。

在一天结束时,MFC认为有没有内存泄漏。

你的解决方案是:

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

  2. 在静态库中有一些初始化,反初始化函数。在MFC应用程序退出之前调用取消初始化函数,此时MFC开始拖动它仍然认为存在的分配。

+0

谢谢。我认为第二个解决方案是非常好的答案,但是图书馆的重新分配是非常复杂的,我尝试着1.非常感谢 – user1006322