查看: 1782|回复: 5

智能指针release的之后,如何释放Node节点呢???

[复制链接]

该用户从未签到

发表于 2014-6-9 10:36:04 | 显示全部楼层 |阅读模式
用release的之后,如何释放Node节点呢???
osg::Node* fun()
{
osg::ref_ptr<osg::Node>  node = new osg::Node;
return node.release();
}

该用户从未签到

发表于 2014-6-9 12:51:49 | 显示全部楼层
直接返回只能指针node,不要返回node*,不需要释放。

该用户从未签到

发表于 2014-6-9 23:00:02 | 显示全部楼层
本帖最后由 cenfer 于 2014-6-9 23:21 编辑

1.osg::Referenced 的子类无法直接手动释放。因为其析构函数是受保护的。
2.release()取消了自动释放,并将引用对象返回。
3.不能只干巴巴的看这样的一个函数,而要看怎么用它。
这样的函数只是创建一个节点,如果不加入场景树中基本没有意义。
只有进行了赋值等操作,创建的节点才有可能加入场景树中。
把创建的节点赋值给智能指针或者加入智能指针的根节点下,就能自动管理该对象的释放。
如果只是创建出来,不进行任何操作,就不可能产生智能引用,结果只能是内存泄露!

该用户从未签到

发表于 2014-6-14 09:25:34 | 显示全部楼层
cenfer 发表于 2014-6-9 23:00
1.osg::Referenced 的子类无法直接手动释放。因为其析构函数是受保护的。
2.release()取消了自动释放,并 ...

你最后一句,如果下面这种情况
{
osg::ref_ptr<osg::Node>  nodexxx = new osg::Node;
nodexxx ->xxxxxxx;
}
难道nodexxx 会产生泄露?

该用户从未签到

发表于 2014-6-14 11:37:41 | 显示全部楼层
本帖最后由 cenfer 于 2014-6-14 16:20 编辑

大哥我的回答是针对一楼的提问,不要断章取意。
具体的说就是,一楼所说的fun()函数创建的非智能指针,如果不加以智能引用就会产生泄露。
可以测试下如下代码的内存情况
while(1){osg::Node* node = fun();}//没有智能引用
while(1){osg::ref_ptr<osg::Node> node = fun();}//进行了智能引用

你说的这种情况,创建的是智能指针,作用域结束会自动释放。
但nodexxx ->xxxxxxx如果是release()之类的方法,取消了智能引用,又不进行其他产生智能引用的操作,就会泄露

该用户从未签到

发表于 2014-6-15 12:23:14 | 显示全部楼层
osg已经明确声明要使用智能指针,即使release()之后,也会马上让其他的只能指针对象保存在指针,如果你硬要非常规操作,你可以试试unref()函数。

就好比电工一定要带绝缘手套,但你非要试试不带手套会怎样(比喻可能不带恰当),没有这个必要
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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