关于OSG智能指针 osg::ref_ptr 的一些测试

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(
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值