为了让OSG的开发者更加专注与功能开发远离c++最最烦心的指针(当然指针也是c++如此牛掰的根源),OSG也使用了类似其他一些高级语言的GC.

OSG的垃圾回收主要是包含两个方面: osg::ref_ptr<>-自动回收内存 和 osg::Referenced-引用计数类.

osg::ref_ptr<>

osg::ref_ptr<>既可以向c++的普通指针一样使用(operator*(),operator->,operator=()),也有它的高级功能(operator==(), operator!=() , operator!(),valid(),release()).

类似普通指针的几个方法和operator==(), operator!=() , operator!()就不介绍了.

valid()和some_ptr!=NULL是一样的.判断指针是否为空

release()这个方法是返回一个智能指针指向的内容,主要作用:因为c++局部变量的作用域是两个大括号之间,当程序运行过大括号时,osg::ref_ptr<>会自动释放其指向的内存空间,所以如下方法:

作者:kjwang
链接:https://zhuanlan.zhihu.com/p/37816503
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。#include <osg/ref_ptr>
#include <osg/Referenced>
#include <iostream>
class MonitoringTarget : public osg::Referenced
{public:MonitoringTarget( int id ) : _id(id){ std::cout << "Constructing target " << _id << std::endl; }protected:virtual ~MonitoringTarget(){ std::cout << "Destroying target " << _id << std::endl; }int _id;
};
osg::ref_ptr<MonitoringTarget> target = new MonitoringTarget(0);
std::cout << "Referenced count before referring: "<< target->referenceCount() << std::endl;
osg::ref_ptr<MonitoringTarget> anotherTarget = target;
std::cout << "Referenced count after referring: "<< target->referenceCount() << std::endl;
for ( unsigned int i=1; i<5; ++i )
{osg::ref_ptr<MonitoringTarget> subTarget = new MonitoringTarget(i);
}

打印结果:

而我们想在一个函数中返回其中一个局部osg::ref_ptr<>变量所指向的内容时,

MonitoringTarget* createMonitoringTarget( unsigned int id )
{osg::ref_ptr<MonitoringTarget> target = new MonitoringTarget(i);return target.get();
}

就会发现上述代码得不到内容.

此时我们就会用到release()函数了.

MonitoringTarget* createMonitoringTarget( unsigned int id )
{
osg::ref_ptr<MonitoringTarget> target = new MonitoringTarget(i);
return target.release();
}

release()的作用就是禁止智能指针释放其所指向的内容,且返回一个c++的普通指针.

注意: 接这个函数的返回值时必须用新的osg::ref_ptr<>包装一下,这样就可以正常使用了.

osg::Referenced

osg::Referenced类是osg中所有成员的base class.它的方法主要是 ref(),unref(),referenceCount().

ref().是在这个类被osg::ref_ptr<>包装时,就是把计数器+1.

unref():包装了这个类的osg::ref_ptr<>被释放时,计数器-1.当为0时,就是回收这块内存空间.

注意:osg::Referenced类的析构函数是protected类型的.所以不可以在局部变量中使用以下代码:

osg::Node node;//osg::node间接继承自osg::Referenced     !!!!错误代码!!!!

注意:既然是引用计数,一定要知道它的最大的不足就是循环引用.

上图是两种循环引用的情况,自循环和相互引用.这都是在使用智能指针(引用计数形)一定要注意的地方.

本文转自:https://www.zhihu.com/column/c_187589347

OSG的垃圾回收机制相关推荐

  1. 详细介绍Java垃圾回收机制

    垃圾收集GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部运行机制上看,Java的垃圾回收原理与机 ...

  2. JAVA中的垃圾回收机制以及其在android开发中的作用

    http://blog.csdn.net/xieqibao/article/details/6707519 这篇文章概述了JAVA中运行时数据的结构,以及垃圾回收机制的作用.在后半部分,描述了如何检测 ...

  3. 图解 Java 垃圾回收机制,写得非常好!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 原文:https://www.oracle.com/webfold ...

  4. 详解JVM内存管理与垃圾回收机制2 - 何为垃圾

    随着编程语言的发展,GC的功能不断增强,性能也不断提高,作为语言背后的无名英雄,GC离我们的工作似乎越来越远.作为Java程序员,对这一点也许会有更深的体会,我们不需要了解太多与GC相关的知识,就能很 ...

  5. Python3.5源码分析-垃圾回收机制

    Python3源码分析 本文环境python3.5.2. 参考书籍<<Python源码剖析>> python官网 Python3的垃圾回收概述 随着软硬件的发展,大多数语言都已 ...

  6. 深入浅出Java垃圾回收机制

    2019独角兽企业重金招聘Python工程师标准>>> 对于Java开发人员来说,了解垃圾回收机制(GC)有哪些好处呢?首先可以满足作为一名软件工程师的求知欲,其次,深入了解GC如何 ...

  7. Java 垃圾回收机制,13张图给你讲清楚!

    作者:Rhys_Lee 等等等 https://blog.csdn.net/zl1zl2zl3/article/details/90904088 什么是自动垃圾回收? 第一步:标记 第二步:清除 压缩 ...

  8. 安卓 java内存碎片_理解Android Java垃圾回收机制

    Jvm(Java虚拟机)内存模型 从Jvm内存模型中入手对于理解GC会有很大的帮助,不过这里只需要了解一个大概,说多了反而混淆视线. Jvm(Java虚拟机)主要管理两种类型内存:堆和非堆. 堆是运行 ...

  9. java垃圾回收机制_笔记 | Java垃圾回收机制

    本文经授权转载自程序员杂货铺(ID:speakFramework) 垃圾回收 最近上海的小伙伴是不是要被强垃圾分类搞疯了???哈哈哈哈 上海是个走在前列的城市啊,不光骑自行车闯红灯要被罚钱,垃圾不分类 ...

最新文章

  1. 新一代图像AI ISP技术
  2. java if (name!=null name!=),命名不规范,lombok泪两行!
  3. Journey源码分析四:url路由
  4. 实验室信息管理系统(南京浩展软件)
  5. Windows Server 2016 Hyper-v 嵌套虚拟化技术
  6. 前端if else_应该记录的一些项目代码(前端)
  7. 像数据科学家一样思考:12步指南(中)
  8. 将数据库返回的ResultSett转换成List装Map形式的方法(ResultSetToList)
  9. Mppt光伏最大功率点跟踪控制matlab仿真
  10. 获取自己win10系统的产品密匙
  11. alt+f2无法切换 linux,X 冻结: 无法通过 Ctrl + Alt + F2/F3 切换到虚拟终端(其实已经切过去了, 只是屏幕没有更新)...
  12. consul java_集成Consul负载均衡多实例注册_java_天雨流芳-CSDN博客
  13. 多重纹理——像素着色器
  14. js object转json
  15. 编程导论以python为舟_计算机科学导论--以Python为舟
  16. 关键对话:如何高效能沟通
  17. kvm 验证-模拟字节码执行
  18. 工具推荐:ST-MCU-FINDER(ST意法半导体MCU选型,产品查找工具)
  19. Mac 下Qt 设计师模式下菜单栏不显示问题
  20. mooc作业怎么上传附件_适合团队协作的工作便签软件怎么在团队便签中上传附件文件?_纳图电脑维修...

热门文章

  1. mysql 权限命令 revoke_mysql 权限管理使用 grant/revoke
  2. php创建分页类,一个最强的PHP通用分页类
  3. 给脚本添加到环境变量_让你的脚本可以在任意地方都可执行的几个方法
  4. java中throws用法_java中throws实例用法详解
  5. xp系统web服务器搭建教程,Windows_XP配置WEB服务器教程(图)
  6. oracle insert into values select from,ORACLE语法中的INSERT INTO。。。SELECT。。。 收藏
  7. vue怎么自己创建组件并引用_Vue 实现创建全局组件,并且使用Vue.use() 载入方式
  8. python识别图片指定位置文字_python批量识别图片指定区域文字内容
  9. 牛客小白月赛12 D 月月给华华出题 (欧拉函数,数论,线筛)
  10. Wannafly挑战赛22 C 多项式(大数,多项式极限)