使用OpenSceneGraph会经常见到这样的代码
ref_ptr模板类型继承自Referenced类,Referenced类有三个基本函数:
osg::ref_ptr<osg::Node> nodeRptr = new osg::Node;
osg::ref_ptr即为Reference counted objects 每次使用时自动递增,用完后自动递减,当最后一个 计数器变为0,对象自动销毁。
ref_ptr模板类型继承自Referenced类,Referenced类有三个基本函数:
- void ref()增加引用计数
- void unref()减少引用计数
- 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超出作用域后,发生内存泄露。