OpenSceneGraph:智能指针
1. 从只能指针中获取原始指针的方法有:
osg::ref_ptr<osg::Geode> geodePtr = new osg::Geode();
osg::Geode* obj1 = *geodePtr; //获取Geode指针
osg::Geode* obj2 = geodePtr.get(); //获取Geode指针
2.下面代码存在性能问题
while(1)
{
osg::ref_ptr<osg::Geode> geodePtr = new osg::Geode ;
}
智能指针只存在while循环中因此每次循坏都会反复将新分配的对象地址传入智能指针,然后ref_ptr对象析构时引用计数归0,
Geode对象被析构,最终并不会产生内存泄露,但会引起效率问题。
3. 每一个OSG场景对象都维护一个或数个ref_ptr类型的成员变量,因此下面两种操作Geode对象都可以:
//假设已经存在geodeParent父对象
osg::ref_ptr<osg::Geode> geodePtr = new osg::Geode;
geodeParent->setGeode(geodePtr);
//或者
osg::Geode* geodePtr = new osg::Geode;
geodeParent->setGeode(geodePtr);
另一个需要特别注意的是ref_ptr作为函数返回值的传递时:
osg::Geode* createGeode()
{
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
//下面做法为错误的
//return geode.get();
//正确做法
return geode.release();
}
用get()时,当函数体结束时,ref_ptr对象析构同时使geode对象引用计数归零,使得geode对象被析构
导致返回的指针地址无效。正确做法使用release(),即将引用对象实例输出,同时引用计数归0,但不释放。
4. 综上, 使用ref_ptr的几条规则:
1. OSG中新创建的场景对象建议使用ref_ptr进行内存的管理;
2. 对于不使用ref_ptr的对象,引用计数值无意义,无法自动从场景对象中卸载;
3. 新建对象最为函数结果返回时,建议使用release()传递,并将返回值引入ref_ptr自动管理。
转自:https://www.cnblogs.com/hzhg/archive/2011/12/30/1908726.html
和 OpenSceneGraph三维渲染引擎设计与实现