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

使用OpenSceneGraph会经常见到这样的代码
 osg::ref_ptr 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 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 nodeRefPtr = new osg::Node; 
group->addChild( nodeRefPtr.get() ); 
} 
 

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

你可能感兴趣的:(CG技术)