查看: 2163|回复: 16

对osg::ref_ptr<T>类release()函数的疑问

[复制链接]

该用户从未签到

发表于 2010-11-2 15:17:01 | 显示全部楼层 |阅读模式
这个函数析构了智能指针,引用计数也归0了,但是不释放。那么什么时候才释放这个资源呢?

一般在函数返回时会使用这个函数传递对象。是不是当这个函数结束的时候就释放了呢?

该用户从未签到

发表于 2010-11-2 16:42:28 | 显示全部楼层
这个函数的意思是不再使用智能指针管理对象,这样的话资源永远不会释放!除非您再次把它传入某个ref_ptr或者手动删除

该用户从未签到

发表于 2010-11-2 18:17:54 | 显示全部楼层
请问一般有必要用release()函数吗?

该用户从未签到

 楼主| 发表于 2010-11-2 20:23:01 | 显示全部楼层
多谢,了解!

该用户从未签到

发表于 2010-11-3 08:22:03 | 显示全部楼层
在作为函数返回值时,release()非常方便,例如:

osg::Node* createNode()
{
    osg::ref_ptr<osg::Node> node = ...;
    ...
    return node.release();
}

只要这个函数的返回结果能够再次被其他对象引用,那么这就是安全的,并且比返回ref_ptr要更为简单和高效

该用户从未签到

 楼主| 发表于 2010-11-3 08:35:07 | 显示全部楼层
呵呵,Array讲的很清楚,这个写法很好,学习了!

该用户从未签到

 楼主| 发表于 2010-11-3 09:23:54 | 显示全部楼层
本帖最后由 aaa696 于 2010-11-3 09:30 编辑

不过用这种方法也要特别小心,特别是返回的类型,容易和智能指针混淆。造成比较难分析的堆栈错误!

该用户从未签到

 楼主| 发表于 2010-11-3 10:41:28 | 显示全部楼层
在作为函数返回值时,release()非常方便,例如:

osg::Node* createNode()
{
    osg::ref_ptr node = ...;
    ...
    return node.release();
}

只要这个函数的返回结果能够再次被其他对象引用,那么这 ...
array 发表于 2010-11-3 08:22


1. Array说返回的结果被其他对象引用,这个对象应该是指智能指针对象吧?
2. 如果经过多次传递(即这个对象被一个普通指针引用,而这个普通指针再被智能指针引用),不知道这样是否存在问题?

该用户从未签到

发表于 2010-11-3 12:43:46 | 显示全部楼层
1. 例如parent->addChild(node),parent就是引用了这个node的对象,它的内部已经使用智能指针来管理子节点
2. 不存在问题,只要您自己清楚就可以

该用户从未签到

 楼主| 发表于 2010-11-3 15:06:41 | 显示全部楼层
更正一下:“这个对象(A)被一个普通指针(B)引用,而这个普通指针(B)再被智能指针(C)引用”
我在这里说的“这个对象(A)”,就是上面函数的返回结果,也是一个普通指针。 应该只有直接被智能指针(C)引用的那个普通指针(B),才是安全的。而(A)会造成泄漏!

该用户从未签到

发表于 2010-11-3 17:14:18 | 显示全部楼层
答案是不会~~因为在A->B->C的过程中您并没有分配任何新的资源!

该用户从未签到

 楼主| 发表于 2010-11-3 20:44:52 | 显示全部楼层
本帖最后由 aaa696 于 2010-11-3 21:46 编辑

我大概是这样理解的,用代码说明好了。有如下函数:

osg::Geode* createGeode()
{
    osg::ref_ptr<osg::Geode> geode = new osg::Geode;
    ...
    return geode.release();
}

调用代码段如下:

osg:ositionAttitudeTransform* pos= new osg::PositionAttitudeTransform;
pos->addChild(createGeode());

osg::ref_ptr<osg::Camera> camera = new osg::Camera;
camera->addChild(pos);

这时createGeode()返回的geode会造成内存泄漏吧!?

该用户从未签到

发表于 2010-11-4 08:11:39 | 显示全部楼层
答案依然是不会~~

该用户从未签到

 楼主| 发表于 2010-11-4 08:44:11 | 显示全部楼层
谢谢!

该用户从未签到

发表于 2010-12-30 21:52:26 | 显示全部楼层
学习了,谢谢各位

该用户从未签到

发表于 2013-11-27 15:56:08 | 显示全部楼层
arry讲的很好,我也受教了。

该用户从未签到

发表于 2013-11-27 16:55:54 | 显示全部楼层
如果不用release()是不是也可以啊?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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