OSG很久了,但本来编程就比较渣渣,看的书也比较少,所以,对这个新事物的理解总不是那么深刻。近日看到一篇博文《OSG 智能指针陷阱 总结》,发现博文中有很多问题,特在此把自己的测试及感想分享给同是渣渣的你。
本文的代码是按照《OSG 智能指针陷阱 总结》改编来进行测试的,可以对比来看。
正文:
首先,我对智能指针的理解是,智能指针是对本节点被引用次数进行计数的,也就是初始化后计数为1,代表被自身引用一次。继承自osg::Referenced的类的实例均可以进行引用计数。还有,不管是否声明为智能指针对象,该对象被引用后计数都会增加,而不论是被智能指针还是普通指针所用。(之所以这样说,是因为我觉得他对智能指针的理解有问题)
其次,输出节点的name,只是为了断定该节点是否依然有效。
问题1:
下面这段代码是我按照他第一个问题的解决方法改变来的:
#include
#include
#include
#include
#include
#include
// osg::ref_ptr
rnode = NULL; // osg::Group* root = NULL; osg::Node *rnode = NULL; osg::ref_ptr
root = NULL; // osg::Node *rnode = NULL; // osg::Group *root = NULL; void createNode(){ rnode = osgDB::readNodeFile("lz.osg"); rnode->setName("Hello"); root = new osg::Group; root->addChild(rnode); } void GetNodeFromRoot(osg::Node ** node){ for (int i = 0; i < root->getNumChildren(); ++i) { if (root->getChild(i)->getName().compare("Hello") == 0) { osg::Node * tmp = root->getChild(i); std::cout << rnode->getName() << tmp->getName() << rnode->referenceCount() << std::endl; //root->removeChild(tmp); //std::cout << rnode->getName() << tmp->getName() << rnode->referenceCount() << std::endl; *node = tmp; root->removeChild(tmp); std::cout << rnode->getName() << tmp->getName() << rnode->referenceCount() << std::endl; } } } int main() { createNode(); osg::Node * node = NULL; GetNodeFromRoot(