码迷,mamicode.com
首页 > 其他好文 > 详细

OSG下的引用计数指针(Reference Pointers)的理解

时间:2015-03-01 11:58:21      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:

使用OpenSceneGraph会经常见到这样的代码
 osg::ref_ptr<osg::Node> nodeRptr = new osg::Node;
osg::ref_ptr即为Reference counted objects 每次使用时自动递增,用完后自动递减,当最后一个 计数器变为0,对象自动销毁。
ref_ptr模板类型继承自Referenced类,Referenced类有三个基本函数:
  1. void ref()增加引用计数
  2. void unref()减少引用计数
  3. int getReferenceCount()返回引用数

而通过ref_ptr类,当需要时(执行复制构造函数或赋值操作),引用计数自动增加,不需要时(析构函数)则自动减少。


我们来实际对比一下 :

void SomeClass::someMethod() { 
osg::ref_ptr<osg::Node> nodeRefPtr = new osg::Node; 
osg::Node *nodePtr = new osg::Node; 
}
 nodeRefPtr nodePtr 都通过new被分配在堆上,函数返回时都变量超出作用域

区别在于nodeRefPtr在初始被赋值时,引用计数增加,超出作用域,析构函数被调用,引用计数减为0,对象自我删除,内存清理完毕。而nodePtr超出作用域后,发生内存泄露。



再来看一个例子
void SomeClass::someMethod(osg::Group *group) { 
osg::ref_ptr<osg::Node> nodeRefPtr = new osg::Node; 
group->addChild( nodeRefPtr.get() ); 
} 
 

 通过group->addChild( nodeRefPtr.get() ),ref_ptr引用计数增加到2,所以退出时依然不会删除,直到group也不需要的时候。

OSG下的引用计数指针(Reference Pointers)的理解

标签:

原文地址:http://blog.csdn.net/boksic/article/details/44001421

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!