查看: 1859|回复: 8

请教关于智能指针的问题

[复制链接]

该用户从未签到

发表于 2011-3-8 22:54:06 | 显示全部楼层 |阅读模式
请教大家一个问题,是这样的,我在官方的osgviewerMFC的基础上改动那个框架,运行结束退出后提示有N多的内存泄露问题,后来去直接运行官方例子,竟然也存在如此多的内存泄露~~晕了。。。     
     我仔细查了代码的部分,觉得很有可能是智能指针的使用出了问题,因为在编码时很少注意智能指针的使用规范,导致其计数不准确,也就是说退出时候,其实它的计数并没有到0,因此,内存有大量的泄露。
    于是,我在析构函数里面写了如下语句:
    node.release();//这样它的计数就应该到0了.

    问题来了:
    (1)我在王锐的书中第48页中看到说“被输出的参照对象引用计数归0,但是不释放”,也就是说内存还是没有释放。因此我将代码改成:delete node.release();但这时候又报错了,我查了下,原因在于node的析构函数是保护类型的,并不能访问,于是我悲催了~~~
    (2)我现在想要的就是,有没有一种方法可以在智能指针未能及时释放掉内存时候,能够强制删除其参照对象,以便释放掉内存?另一方面,遇到析构函数为protected类型的时候,该怎么调用呢?

     谢谢大侠们指点~~

该用户从未签到

 楼主| 发表于 2011-3-8 22:55:07 | 显示全部楼层
自己顶一下,谢谢各位大侠们~~

该用户从未签到

发表于 2011-3-9 08:40:28 | 显示全部楼层
您的做法完全是多余的,MFC报内存错误通常是MFC自己的问题,我们不必理睬。
(1)这里是断章取义了,release()仅仅用于函数返回时暂时取消引用计数,这个返回的结果必须再次纳入到智能指针的引用当中,这样就可以避免任何内存泄露了
(2)完全不需要,智能指针可以充分保证内存被及时释放,强制删除是完全没有道理的事情。保护类型方法也不可能存外部调用(除非为友元)

该用户从未签到

 楼主| 发表于 2011-3-9 09:36:31 | 显示全部楼层
回复 3# array


    不是吧,他报那么多内存泄露就不管了?(其实我也很希望我不管这个才好。。。。)

该用户从未签到

发表于 2011-3-9 11:24:42 | 显示全部楼层
osg里面是不用delete的,你就全部用智能指针吧,我以前就是这样搞得,没出现内存泄露

该用户从未签到

发表于 2011-3-9 11:56:58 | 显示全部楼层
嗯,这个问题老早有人说了,应该是mfc的错误侦测

该用户从未签到

 楼主| 发表于 2011-3-9 12:04:12 | 显示全部楼层
回复 6# tianxiao888


    恩,谢谢,这样也好,了却心中一大心病

该用户从未签到

 楼主| 发表于 2011-3-9 12:04:33 | 显示全部楼层
回复 5# wangxiaodi


    恩,好,谢谢您

该用户从未签到

发表于 2014-7-24 17:05:45 | 显示全部楼层
原来是这样我就放心了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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