|
首先感谢 Email列表里面的牛人,是他们帮我找到了解决方法,见下面网页
http://www.vis-sim.com/3dsceneBB/viewtopic.php?t=1027
其内容摘抄如下:
There is a known issue/BUG with MFC, were MFC makes a call to
_CrtDumpMemoryLeaks() in the destructor of the _AFX_DEBUG_STATE, followed by _CrtSetDbgFlag() which sets it to ~_CRTDBG_LEAK_CHECK_DF (therefor disabling memory leak test at *true* program exit) This destructor is called at exit (i.e. atexit()), but before statics residing in dlls and others are destroyed, resulting in many false memory leaks are reported
The MFC memory leak will not go away as Microsoft have no reason to fix it( it been there for many years) as MFC is a deprecated API as far as they are concerned
上面大体意思就是 因为 微软的VS2005编译器在最后程序退出时的步骤里,诊断是否有内存泄露的dll并不一定是最后卸载的 ,这就造成了如果有其他dll在它之后卸载,那么里面的static对象就会被认为是没有释放,而OSG里面有很多 static这种对象,因此才会出现一大串内存泄露消息。
下面是解决方案,牛人提了3 种 ,但是他亲自只试了一种,我也是这么做的:
Another solution to the MFC and wrong memory leak reports. You need to make your MFC dll load first during application start up and unload last during application exit. I managed to do this by making the following change.
尽可能让微软的 dll最后卸载,因此有时候需要人为的把微软的dll配置在首先加载,最后卸载的位置
In your MFC application.
. Goto project settings. In there, make the following changes for theDebug build. 到工程设置里
. General->Use of MFC->Use Standard Windows Libraries. 找到 配置属性->常规->MFC的使用 设置为"使用标准Windows库"
. Add _AFXDLL to C/C++->Preprocessor->Preprocessor Definitions. 在c/c++ ->预处理器 里面的预处理器定义里面加入 _AFXDLL
. Add mfc80??.lib (in my case it is mfc80ud.lib) as a first dependency or at least before osg libs to Linker->Input->Additional
Dependencies. 在链接器->输入->附加依赖项 里面的开始位置加入VS的库,这些库在VS2005的安装目录下面的 VC\atlmfc\lib,我个人加了 mfc80d.lib 和 mfcm80d.lib
You can find what the other mfc libs are in your visual studio install directory\VC\atlmfc\lib. You don't need to do this release mode.
Release模式下就不需要这么做了
其他的解决方法:设置为共享DLL 但是要建立MFC的 dll与osgdll的依赖关系,实际上还是想让 osg的 dll都卸载完 再卸载MFC的dll
If you add a MFC dependency to osg dlls that should also create the desired effect. Change the Use of MFC setting to General->Use of
MFC->Use MFC In a Shared DLL in your debug builds of osg libraries.
This should add MFC dll dependency to your osg dll in debug so forcing MFC dll to unload after the osg dlls but as I said I did not actually
try this.
还有:
Rebuild the MFC dlls with the following change. At least remove the "_CrtDumpMemoryLeaks()" call in
_AFX_DEBUG_STATE's destructor. It is in VS_INSTALL\VC\atlmfc\src\mfc\dumpinit.cpp. The makefile is in VS_INSTALL\VC\atlmfc\src\atlmfc.mak. I did not try this, either. 重新编译 VS的dll
我测试的项目是osg2.4的源码里的 osgMFC 和 论坛里的一个osgMFC的例子,名字叫 RambleSystem, 这两个例子 按照第一种方法的步骤设置完后,都没有内存泄露了, 另外这两个例子是 通过线程实现的 ,我又测试了一个不用线程,而是通过在MFC视图类的 OnDraw方法,不断DoFrame来实现的 osgMFC的例子,结果也没有内存泄露。 |
|