您的位置:首页 > 其它

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了。

   
断断续续写到这里,有错误和理解不足地方希望各位朋友指点,交流。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  MFC osg 内心泄露