mfc下报OSG内存泄漏解决方法

2024-02-29 13:32

本文主要是介绍mfc下报OSG内存泄漏解决方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

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

这篇关于mfc下报OSG内存泄漏解决方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/758962

相关文章

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4:

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

如何将Python彻底卸载的三种方法

《如何将Python彻底卸载的三种方法》通常我们在一些软件的使用上有碰壁,第一反应就是卸载重装,所以有小伙伴就问我Python怎么卸载才能彻底卸载干净,今天这篇文章,小编就来教大家如何彻底卸载Pyth... 目录软件卸载①方法:②方法:③方法:清理相关文件夹软件卸载①方法:首先,在安装python时,下

电脑死机无反应怎么强制重启? 一文读懂方法及注意事项

《电脑死机无反应怎么强制重启?一文读懂方法及注意事项》在日常使用电脑的过程中,我们难免会遇到电脑无法正常启动的情况,本文将详细介绍几种常见的电脑强制开机方法,并探讨在强制开机后应注意的事项,以及如何... 在日常生活和工作中,我们经常会遇到电脑突然无反应的情况,这时候强制重启就成了解决问题的“救命稻草”。那

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F