osg的ref_ptr和observer_ptr

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

ref_ptr就是所谓的强指针类型

observer_ptr是所谓的弱指针类型

需要注意的是他们都是类,而不是指针,只不过他们用于管理指针。

1.如何实现自动内存管理

所谓自动内存管理就是只管对象或指针的创建和使用而不管销毁。

实现自动内存管理指的是ref_ptr,他工作的机理就是每当多引用一次对象(比如addChild)其引用计数就会增加1,多删除一次对象(removeChild)其引用计数就会减1,如果引用计数为0,则销毁对象。

另外定义其对象实例会有生命周期,在对象实例超出生命周期进行销毁时会自动释放所管理的指针,因而实现内存管理,如下代码:

class AAA:public osg::Referenced{

};

int
main(int argc, char** argv)
{
    {
        osg::ref_ptr<AAA> hhh=new AAA();//超出其生命周期时会自动释放AAA指针,从而实现内存管理
    }
    
}

以下使用ref_ptr的方式不推荐使用(虽然也能进行内存管理,不会出现内存泄漏),容易出现不可预期的问题(指针所指向内存已经删除,但是指针并未置NULL,导致再次使用指针时出现不可预期问题)

class AAA:public osg::Referenced{

};

int
main(int argc, char** argv)
{
    AAA* tt=new AAA;
    {
        osg::ref_ptr<AAA> st=tt;
    }//已经删除了内存,但是tt并未置NULL,再次访问tt中的成员函数、成员变量会出现不可预期问题
    
}

下面的代码也很有误导性

class AAA:publ
OSG中的observer_ptr指针 看array大神的CookBook后一些感想,在代码上添加了一些注释,也对源码做了 阅读详情

相关推荐

如何解决OSG内存管理问题?

OSG是使用C++语言开发的,而该语言在动态内存管理方面做得并不好,经常需要程序员手动申请释放内存。这种靠人工管理内存的方式不仅繁琐,而且极易造成内存泄漏,尤其在一个中大型系统中,靠人工管理内存是一项艰巨的任务。 如何解决这类问题??? 数据类型osg::ref_ptr(智能指针)在源码中随处可见,它另外一种数据类型osg::observer_ptr(观察指针)为我们提供了非常良好的动态对象使...

HGT_FreeX的博客 978

osg指针ref_ptrobserver_ptr

使用OSG的人都知道OSG内存管理方式采用了智能指针,通过智能指针的方式让OSG自己处理对象的销毁工作。在OSG中有两个智能指针类型,一个就是我们再熟悉不过的ref_ptr,另外一个可能很多人不一定经常用,但确实非常好的observer_ptr。这两种类型都是作为智能指针而出现的,那他们到底有什么区别?为什么会出现两个类似的东西?下面我们慢慢揭开它们的面纱。 其实它们是两种智能指针类型,一种是我...

qq_17792451的博客 1401

OSG基础之内存管理

OSG是使用C++语言开发的,而该语言在动态内存管理方面做得并不好,经常需要程序员手动申请释放内存。这种靠人工管理内存的方式不仅繁琐,而且极易造成内存泄漏,尤其在一个中大型系统中,靠人工管理内存是一项艰巨的任务。 如何解决这类问题??? 数据类型osg::ref_ptr(智能指针)在源码中随处可见,它另外一种数据类型osg::observer_ptr(观察指针)为我们提供了非常良好的动态对象使...

lavanana的博客 1207

详解osg::ref_ptr

首先,要使用ref_ptr的类必须继承自Referenced类(当然Referenced本身肯定也可以),这样才能使用->ref()unref(),才能正确,ref_ptr其实本身是一个类,后面的是它的对象,但是它重载了->符号,使得它的对象表现得像一个指针的特性一样,所以叫智能指针,这里实现的方法为引用计数。 然后让我们进入ref_ptr的内部: 第一句:ref_pt...

dianxiaochuang7777的博客 1754

osg::observer_ptrosg::ref_ptr用法与区别

osg::observer_ptrosg::ref_ptr做法与区别

danshiming的博客 895

cocos2dx 数据内存管理----RefPtr智能指针

对于所有的UI元素,用autorelease来管理,而对于游戏中的数据,每帧释放一次不适用,所以添加了RefPtr智能指针(模版类)来管理游戏中的数据类(需动态申请内存的数据) 简介:2dx 3.1引入了智能指针RefPtrRefPtr是基于RAII实现的,在RAII中,动态资源的持有发生在一个对象的生命周期之内,也就是在对象的构造函数中分配内存,对象的析构函数中释放内存,这样

码农的自我修养 946

OSG智能指针

OSG智能指针         ref_ptr规则2:绝对不要返回ref_ptr 它自己规则3:绝对不要用ref()、unref(),(或者release()、unref_nodelete())除非你真的真的真的知道你在干什么规则4:任何Referenced 的派生类(无论直接或间接),析构函数都要设为protected,使对象不会被分配到栈上规则5(规则1的例外):循环引用时,当我们知道此对象

like5635的专栏 879

OSG学习第二天-OSG场景图

模式:如果要重新设置距离计算的缺省特性 为物体的包络球,可以调用。缺省条件下,LOD使用距离的最大值最小值来表示范围,但是用户也可以要求 LOD 使用像素大小来设置范围值,此时如果子节点在屏幕上的像素大小符合其有效范围,LOD 将显示这个子节点。要设置 LOD 节点的有效范围模式,可以调用 osg::LOD::setRangeMode(),并设置参数为 PIXEL_SIZE_ON_SCREEN,或者 DISTANCE_FROM_EYE_POINT。

weixin_57013184的博客 554

OSG内存管理

通用的基类:osg::Referenced,所有的osg节点场景图形均继承自这一基类,它包含了一个整形的引用计数器。 Osg定义的智能指针模板类ref_ptr时,Referenced类的引用计数器会自动加一。   当你创建任何继承自Referenced的场景图形节点或数据时,你的应用程序不可以直接释放其内存空间。   Referenced类:实现了对内存区段的引用计

a498506133的专栏 881

OSG智能指针之强指针弱指针

使用OSG的人都知道OSG内存管理方式采用了智能指针,通过智能指针的方式让OSG自己处理对象的销毁工作。在OSG中有两个智能指针类型,一个就是我们再熟悉不过的ref_ptr,另外一个可能很多人不一定经常用,但确实非常好的observer_ptr。这两种类型都是作为智能指针而出现的,那他们到底有什么区别?为什么会出现两个类似的东西?下面我们慢慢揭开它们的面纱。     其实它们是两种智能指针类型

L_Andy的专栏 1294

不可不表的OSG智能指针之强指针弱指针 《转载》

使用OSG的人都知道OSG内存管理方式采用了智能指针,通过智能指针的方式让OSG自己处理对象的销毁工作。在OSG中有两个智能指针类型,一个就 是我们再熟悉不过的ref_ptr,另外一个可能很多人不一定经常用,但确实非常好的observer_ptr。这两种类型都是作为智能指针而出现的,那 他们到底有什么区别?为什么会出现两个类似的东西?下面我们慢慢揭开它们的面纱。 其实它们...

weixin_30235225的博客 107

不可不表的OSG智能指针之强指针弱指针

使用OSG的人都知道OSG内存管理方式采用了智能指针,通过智能指针的方式让OSG自己处理对象的销毁工作。在OSG中有两个智能指针类型,一个就是我们再熟悉不过的ref_ptr,另外一个可能很多人不一定经常用,但确实非常好的observer_ptr。这两种类型都是作为智能指针而出现

Oman-3D 3675

OSG-OSG中的observer_ptr指针

看array大神的CookBook后一些感想,在代码上添加了一些注释,也对源码做了一些研读,记录下学习的过程。       CookBook中第一个例子就是observer_ptr指针,这个指针它的名字一样,就是用来观察指针的,可以把它想象成一个观察者,它只观察一个你给他指点的对象,但是不会影响这个对象的创建销毁,它只是一个旁观者,但是它观察的这个对象要是被销毁了它也会知道并且自己也会被销毁

DreamLife 2393

智能指针

 摘自:Don Burns《Using Reference Pointers in Producer and OpenSceneGraph》ref_ptr 利用引用计数管理分配在堆上的内存,计数为(0)时自动释放内存规则1:对所有从Referenced 继承的类,都用ref_ptr规则2:绝对不要返回ref_ptr 指向的地址,返回ref_ptr 它自己规则3:绝对不要用ref()、unr

虫子的森林资料库 812

OSG的垃圾回收机制

为了让OSG的开发者更加专注与功能开发远离c++最最烦心的指针(当然指针也是c++如此牛掰的根源),OSG也使用了类似其他一些高级语言的GC. OSG的垃圾回收主要是包含两个方面: osg::ref_ptr<>-自动回收内存 osg::Referenced-引用计数类. osg::ref_ptr<> osg::ref_ptr<>既可以向c++的普通指针一样使用(operator*(),operator->,operator=()),也有它的高级..

danshiming的博客 569

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

接触OSG很久了,但本来编程就比较渣渣,看的书也比较少,所以,对这个新事物的理解总不是那么深刻。近日看到一篇博文《OSG 智能指针陷阱 总结》,发现博文中有很多问题,特在此把自己的测试及感想分享给同是渣渣的你。

乖o就一下 2811
上一篇: 将枚举类型和其文字含义对应的方法
下一篇: osgEarth的Rex引擎原理分析(三十二)请求四个状态的含义(IDLE RUNNING MERGING FINISHED)
hankern
博客等级 码龄19年 907粉丝 1016原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值