osg::ref_ptr<osg::Node> nodeRptr = new osg::Node;osg::ref_ptr即为Reference counted objects 每次使用时自动递增,用完后自动递减,当最后一个 计数器变为0,对象自动销毁。
而通过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() ); }