OSG的垃圾回收机制
为了让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的垃圾回收机制相关推荐
- 详细介绍Java垃圾回收机制
垃圾收集GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部运行机制上看,Java的垃圾回收原理与机 ...
- JAVA中的垃圾回收机制以及其在android开发中的作用
http://blog.csdn.net/xieqibao/article/details/6707519 这篇文章概述了JAVA中运行时数据的结构,以及垃圾回收机制的作用.在后半部分,描述了如何检测 ...
- 图解 Java 垃圾回收机制,写得非常好!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 原文:https://www.oracle.com/webfold ...
- 详解JVM内存管理与垃圾回收机制2 - 何为垃圾
随着编程语言的发展,GC的功能不断增强,性能也不断提高,作为语言背后的无名英雄,GC离我们的工作似乎越来越远.作为Java程序员,对这一点也许会有更深的体会,我们不需要了解太多与GC相关的知识,就能很 ...
- Python3.5源码分析-垃圾回收机制
Python3源码分析 本文环境python3.5.2. 参考书籍<<Python源码剖析>> python官网 Python3的垃圾回收概述 随着软硬件的发展,大多数语言都已 ...
- 深入浅出Java垃圾回收机制
2019独角兽企业重金招聘Python工程师标准>>> 对于Java开发人员来说,了解垃圾回收机制(GC)有哪些好处呢?首先可以满足作为一名软件工程师的求知欲,其次,深入了解GC如何 ...
- Java 垃圾回收机制,13张图给你讲清楚!
作者:Rhys_Lee 等等等 https://blog.csdn.net/zl1zl2zl3/article/details/90904088 什么是自动垃圾回收? 第一步:标记 第二步:清除 压缩 ...
- 安卓 java内存碎片_理解Android Java垃圾回收机制
Jvm(Java虚拟机)内存模型 从Jvm内存模型中入手对于理解GC会有很大的帮助,不过这里只需要了解一个大概,说多了反而混淆视线. Jvm(Java虚拟机)主要管理两种类型内存:堆和非堆. 堆是运行 ...
- java垃圾回收机制_笔记 | Java垃圾回收机制
本文经授权转载自程序员杂货铺(ID:speakFramework) 垃圾回收 最近上海的小伙伴是不是要被强垃圾分类搞疯了???哈哈哈哈 上海是个走在前列的城市啊,不光骑自行车闯红灯要被罚钱,垃圾不分类 ...
最新文章
- 新一代图像AI ISP技术
- java if (name!=null name!=),命名不规范,lombok泪两行!
- Journey源码分析四:url路由
- 实验室信息管理系统(南京浩展软件)
- Windows Server 2016 Hyper-v 嵌套虚拟化技术
- 前端if else_应该记录的一些项目代码(前端)
- 像数据科学家一样思考:12步指南(中)
- 将数据库返回的ResultSett转换成List装Map形式的方法(ResultSetToList)
- Mppt光伏最大功率点跟踪控制matlab仿真
- 获取自己win10系统的产品密匙
- alt+f2无法切换 linux,X 冻结: 无法通过 Ctrl + Alt + F2/F3 切换到虚拟终端(其实已经切过去了, 只是屏幕没有更新)...
- consul java_集成Consul负载均衡多实例注册_java_天雨流芳-CSDN博客
- 多重纹理——像素着色器
- js object转json
- 编程导论以python为舟_计算机科学导论--以Python为舟
- 关键对话:如何高效能沟通
- kvm 验证-模拟字节码执行
- 工具推荐:ST-MCU-FINDER(ST意法半导体MCU选型,产品查找工具)
- Mac 下Qt 设计师模式下菜单栏不显示问题
- mooc作业怎么上传附件_适合团队协作的工作便签软件怎么在团队便签中上传附件文件?_纳图电脑维修...
热门文章
- mysql 权限命令 revoke_mysql 权限管理使用 grant/revoke
- php创建分页类,一个最强的PHP通用分页类
- 给脚本添加到环境变量_让你的脚本可以在任意地方都可执行的几个方法
- java中throws用法_java中throws实例用法详解
- xp系统web服务器搭建教程,Windows_XP配置WEB服务器教程(图)
- oracle insert into values select from,ORACLE语法中的INSERT INTO。。。SELECT。。。 收藏
- vue怎么自己创建组件并引用_Vue 实现创建全局组件,并且使用Vue.use() 载入方式
- python识别图片指定位置文字_python批量识别图片指定区域文字内容
- 牛客小白月赛12 D	月月给华华出题 (欧拉函数,数论,线筛)
- Wannafly挑战赛22 C	多项式(大数,多项式极限)