查看: 1856|回复: 1

VC2010下编译的Debug版本osgMFC仍然存在内存泄露?

[复制链接]

该用户从未签到

发表于 2011-11-22 15:25:41 | 显示全部楼层 |阅读模式
在网上搜了一下,说是osgd.dll后于mfcXXd.dll释放,导致mfc误认为osg中全局变量没有释放,并给出了解决办法:

  i) in the General tab, switch "Use MFC in a shared DLL" to "Use Standard Windows Libraries"
  ii) in the C/C++/Preprocessor tab, add _AFXDLL to the preprocessor definitions
  iii) in the Linker/Input tab, add mfc71d.lib anywhere before osgd.lib

可是我在VC2010中按那三步修改之后,没向OSG中添加任何节点,仍然存在内存泄露:

    Detected memory leaks!
    Dumping objects ->
    {409742} normal block at 0x038F7E90, 12 bytes long.
    Data: < } P} > 90 17 83 03 08 7D 8F 03 50 7D 8F 03
    {409741} normal block at 0x038F7E48, 8 bytes long.
    Data: <\} > 5C 7D 8F 03 00 00 00 00
    {409740} normal block at 0x038F7D50, 184 bytes long.
    Data: <T(j H~ > 54 28 6A 0F 00 00 00 00 01 00 00 00 48 7E 8F 03
    {409739} normal block at 0x038F7D08, 12 bytes long.
    Data: < ~ { { > 90 7E 8F 03 80 7B 8F 03 C8 7B 8F 03
    {409738} normal block at 0x038F7CC0, 8 bytes long.
    Data: < { > D4 7B 8F 03 00 00 00 00
    {409737} normal block at 0x038F7BC8, 184 bytes long.
    Data: <T(j | > 54 28 6A 0F 00 00 00 00 01 00 00 00 C0 7C 8F 03


    ………………………………………………………………………………………………………………………………



    {539} normal block at 0x002B95F0, 8 bytes long.
    Data: <@ + > 40 95 2B 00 00 00 00 00
    {538} normal block at 0x002B95A8, 8 bytes long.
    Data: < + > 10 95 2B 00 00 00 00 00
    {537} normal block at 0x002B94A8, 196 bytes long.
    Data: <$ > 24 05 18 10 00 00 00 00 07 00 00 00 00 00 00 00
    Object dump complete.

复制代码


请问在VC2010里要怎样才能解决OSG内在泄露的问题呀?

mfc71d.dll文件也都下载了 ,放到系统文件夹了  
http://www.dlldq.com/files/mfc71d.dll.html

另外,还想问两个问题:
1、我的OSG编译时使用了UTF-8支持,那么在osgMFC中是不是也必须设置“使用 Unicode 字符集”?如果设置成“使用多字节字符集”会出现什么问题吗?
2、网上说通过上面的三步修改Debug设置后,必须设置“使用多字节字符集”,如果设置“使用 Unicode 字符集”则会报error LNK2019的链接错误。怎样解决在“使用 Unicode 字符集”时的链接错误呀?

请高手帮帮忙啊!不胜感激。

该用户从未签到

发表于 2011-11-22 15:46:28 | 显示全部楼层
关于内存泄露你没有理解,这里不是mfc71d的问题,这是mfc类库的特点,因为osg是多线程启动程序,而osgmfc的渲染类有静态变量和静态函数,它在mfc的dll卸载之前卸载,mfc就会认为有内存泄露。这不是一个真正的内存泄露。
  其实,你自己可以重现这个bug, 自己写一个类,添加静态成员,然后多线程启动,销毁时mfc结束后也会报错。我同事再用mak-rti的时候也遇到过类似的问题。
  
  所以你需要设置的vc2010里的dll卸载顺序,这和mfc71d.dll没关系。而且Release版本应该没问题。即实际应用应该没问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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