OSG嵌入到MFC中报内存泄露
2013-02-22 22:40
274 查看
这篇博文在半年以前就想写,但是网上有很多的答案,能够解决我所遇见的问题,加之自己对OSG和MFC的理解浅薄,所有就一直没有动笔,但是这周又遇见了OSG和MFC结合报内存泄露的问题,解决的方法和以前的一样,但是由此引发的问题貌似网上没有给出有效的解决方法,所以在前辈的基础上写点东西,希望能够帮上遇见同样问题的朋友们。
OSG和MFC结合造成表面上的内存泄露,其实是一种假象,真正是没有内存泄露的。那为什么会出现这样的问题,根据前辈们的解释如下:由于在MFC的dll卸载时会调用内存检测函数,此时OSG的dll也许并没有卸载掉,这样就会被检测到new的对象没有释放,也就出现了开始的内存泄露不止。具体的参考此博客文章(谢谢这位仁兄):http://blog.sina.com.cn/s/blog_4bef16b901015ffx.html。那解决的办法自然是将MFC的dll先于OSG的dll加载,这样卸载是就在OSG的dll后面卸载,这样在卸载MFC的dll是检测内心泄露,而OSG的dll早卸载掉,自然就没有报内存泄露,方法如下:
Goto project settings. In there, make the following changes for theDebug build.
General->Use of MFC->Use Standard Windows Libraries.
Add _AFXDLL to C/C++->Preprocessor->Preprocessor Definitions.
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.
上面的英文相信大家都可以看明白,但是这样的设置会引起一些问题。
问题1:也许会奔溃,主要是由于添加的lib引起的,上面的这位前辈添加lib时有两个版本,比如:mfc80d.lib和mfc80ud.lib,为什么会出现两个版本呢,相比大家都知道的,宽字符和unicode版的lib,所有在添加lib时候要和你设置的字符集统一。
问题2:采用unicode字符集编译,附加库添加mfc90ud.lib,发现也会出现error
LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup的错误。
遇见这样的问题,很多的朋友都就会选择使用宽字符集,其实这个和字符集没有关系的,仔细的看这个链接错误,就只找不到主函数的入口,所有只需要重新的指定函数的入口即可:项目属性->linker->Advances->Inty
point中输入:wWinMainCRTStartup。这样也许就可以run了。
断断续续写到这里,有错误和理解不足地方希望各位朋友指点,交流。
OSG和MFC结合造成表面上的内存泄露,其实是一种假象,真正是没有内存泄露的。那为什么会出现这样的问题,根据前辈们的解释如下:由于在MFC的dll卸载时会调用内存检测函数,此时OSG的dll也许并没有卸载掉,这样就会被检测到new的对象没有释放,也就出现了开始的内存泄露不止。具体的参考此博客文章(谢谢这位仁兄):http://blog.sina.com.cn/s/blog_4bef16b901015ffx.html。那解决的办法自然是将MFC的dll先于OSG的dll加载,这样卸载是就在OSG的dll后面卸载,这样在卸载MFC的dll是检测内心泄露,而OSG的dll早卸载掉,自然就没有报内存泄露,方法如下:
Goto project settings. In there, make the following changes for theDebug build.
General->Use of MFC->Use Standard Windows Libraries.
Add _AFXDLL to C/C++->Preprocessor->Preprocessor Definitions.
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.
上面的英文相信大家都可以看明白,但是这样的设置会引起一些问题。
问题1:也许会奔溃,主要是由于添加的lib引起的,上面的这位前辈添加lib时有两个版本,比如:mfc80d.lib和mfc80ud.lib,为什么会出现两个版本呢,相比大家都知道的,宽字符和unicode版的lib,所有在添加lib时候要和你设置的字符集统一。
问题2:采用unicode字符集编译,附加库添加mfc90ud.lib,发现也会出现error
LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup的错误。
遇见这样的问题,很多的朋友都就会选择使用宽字符集,其实这个和字符集没有关系的,仔细的看这个链接错误,就只找不到主函数的入口,所有只需要重新的指定函数的入口即可:项目属性->linker->Advances->Inty
point中输入:wWinMainCRTStartup。这样也许就可以run了。
断断续续写到这里,有错误和理解不足地方希望各位朋友指点,交流。
相关文章推荐
- mfc框架下osg的内存泄露问题(转)
- MFCLinkCtrl 的内存泄露问题
- 浅谈MFC内存泄露检测及内存越界访问保护机制
- 关于MFC下检查和消除内存泄露的技巧
- OGRE与MFC结合产生的内存泄露问题
- 浅谈MFC内存泄露检测及内存越界访问保护机制
- 卸载MFC DLL时出现内存泄露
- WINCE-MFC-CDC使用出现的4KB内存泄露解决办法,坑爹的MFC
- MFC内存泄露报告
- MFC工程检测内存泄露方法
- 关于MFC下检查和消除内存泄露的技巧
- mfc非模态子对话框调用内存泄露问题
- 关于MFC下检查和消除内存泄露的技巧
- 浅谈MFC内存泄露检测及内存越界访问保护机制
- GDI+ 和MFC内存泄露检测
- Ogre1.6和MFC内存泄露冲突
- MFC解决程序退出时死锁和内存或资源泄露的问题
- 关于MFC下检查和消除内存泄露的技巧
- mfc下报OSG内存泄漏解决方法
- 浅谈MFC内存泄露检测与内存访问越界检测机制