heishuijing2222 发表于 2008-5-14 15:57:35

osgMFC例子 VS2005报内存泄露的解决方法

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

donghua 发表于 2008-5-15 07:16:46

真不错,大家一直对MFC中使用osg内存泄漏有困惑,现在心里终于可以安慰了,非常感谢。

fk1007 发表于 2008-11-2 19:11:29

不错不错

第一种方法简单实用,试了,效果明显啊,哈哈,谢了!

lyx_lyx 发表于 2008-12-9 13:47:43

我在做一个MFC项目的时候也出现了内存泄漏的问题,同样是在程序退出的时候提示memory leak,如果按照这位牛人的说法,是不是指这种退出时的内存泄漏只是一种误报呢?实际内存并没有泄漏,毕竟没有修改代码就可以改变最后的提示信息。
我对使用标准Windows库有一点顾虑,主要是我不清楚它和使用共享DLL的区别。不敢随便改。毕竟现在一般的程序用的都是共享DLL

stonylhy 发表于 2008-12-28 09:23:15

奇怪了,我用这个方法改了以后,程序在运行期间出错了,不知道怎么回事。我也是直接改的RambleSystem这个程序啊

yangzhi0903 发表于 2010-2-4 17:28:16

我尝试用楼主所说的方法,但是问题依然存在呢,不知道为啥? 1# heishuijing2222

cwencool 发表于 2010-10-28 13:43:34

正好看到,也谢谢,谢谢

tianxiao888 发表于 2010-11-9 12:20:55

装了sp1还会有么,我一直没注意

chuyanj 发表于 2010-11-28 00:55:22

有没有不用线程的例子

tianxiao888 发表于 2010-11-29 10:32:59

不用开线程的倒是没有见过呢,不知道可行否

fenma3422 发表于 2011-8-22 20:19:02

不用线程好像很卡

excess 发表于 2012-3-7 19:25:04

苦于内存泄露,这下终于知道原因了,太感谢了

knightlixiao 发表于 2012-4-13 15:31:15

感谢楼主啊!

apple772 发表于 2012-6-8 11:52:49

请问一下,点击mfc主界面上的一个按钮出现一个非模态的对话框,同时非模态的对话框还显示着osg渲染出来的图,这可以实现吗?
急呀,都不知道能不能实现呢

tianxiao888 发表于 2012-6-13 10:39:33

当然可以~~你参考下osgMFC的例子

木子匕 发表于 2012-7-23 17:17:26

英语水平差的表示有点亚历山大啊!还不习惯阅读英文文档啊!

tianxiao888 发表于 2012-7-24 08:58:38

不是有对照翻译,呵呵~~
页: [1]
查看完整版本: osgMFC例子 VS2005报内存泄露的解决方法