查看: 1200|回复: 2

内存泄漏

[复制链接]

该用户从未签到

发表于 2011-5-18 13:46:41 | 显示全部楼层 |阅读模式
今天我在调试osg例子中的osgMDIMFC,发现退出的时候,在输出框中vc2008检测出有内存泄漏,不知道会不会有什么影响?怎样才能消除呢?在osg中如何保证内存不泄漏呢?

该用户从未签到

发表于 2011-5-18 13:51:52 | 显示全部楼层
以下是以前帖子里相同问题的解决方法,,,不过我试着弄过,好像没用,,,虽然泄露,但基本不影响功能

你试试吧
----------------------------------------------------------------------


首先感谢 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的例子,结果也没有内存泄露

该用户从未签到

 楼主| 发表于 2011-5-18 19:29:23 | 显示全部楼层
非常感谢高手指导
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表