18.5 reference counter
来源:互联网 发布:移动电玩城源码 编辑:程序博客网 时间:2024/05/29 13:21
一.作用:共享类时,用于标记类被共享的次数。每被一个类共享,rc++;每有一个类结束共享,rc--;当rc=0时,被共享的类才被销毁。这避免了:
1. 某类已无共享,但仍留在内存中。
2. 某类仍被其他类共享,却被提前销毁。
模型,render state 均可被共享。
一般通过智能指针来管理rc。
Object 类的两个内容:1。Run time typeinformation;(用于存储类的类型)
2. reference counter.(rc变量及递增递减rc的函数)
内存泄露追踪系统:object 类中存在一个static成员 hash-map* InUse ,它用于追踪游戏系统存在的类,游戏初始化时,该hash_map为空,游戏进行时,hash_map会相应变化,游戏结束时,hash_map应当为空,若不为空,则会由static函数PrintInUse输出,便于程序员处理内存泄露。
二.智能指针便是基于上述内存泄露追踪系统建立的:
1. 智能指针是模板类,template<class T> 该指针指向被共享的类T,智能指针的唯一private成员变量时指向被共享的类的一般指针。
2. Sp的constructor会将rc++(每当为T声明一个sp,即是引用了一次),destructor会将rc--(原理同上)
3. 赋值操作符的重载中,在调用rc++,rc—之前,会比较赋值双方是否相等,这是为了:
(1) 防止自我赋值。
(2) 防止意外的自我销毁。(先++为1,后—为0,检测到0立即自我销毁)
4. Implict conversions的作用有二:
(1) 使sp看起来似乎支持了多态性(说明:node基于spatial,因此spatialptr* a=Nodeptr* b;合法。然而,NodePtr 并非基于SpatialPtr,两者均为Pointer类的模板产物。)但是由于implictconversions,我们可以多态性。(代码见p806)
(2) 支持了sp是否为null的判断。(通过重载bool转换符实现)
三, 智能指针在使用过程中应注意的问题。
1. 智能指针本身无需new,声明一个即可。注意:sp完成使命后一定要赋值为0。(类似于一般指针。)
2. Sp只能指向动态分配内存的对象。
3. 将智能指针用作函数参数和返回值时应高度谨慎!!!
问题的根源在于函数将参数传入时会执行一次constructor,(建立本地副本),函数结束时会进行一次destructor。什么没做,一次con~,一次des~,rc—>1—>0,会造成被共享类的销毁。
返回值同理。
解决办法是:使实参类型或接受返回值的变量类型也为sp,即避免类型转换。(因为在声明实参或接受返回值的变量时rc已经+1,不会出现为0的情况。)
- 18.5 reference counter
- reference counter 引用计数器
- counter
- counter
- Counter
- 实现指针引用计数的类 Reference Counter
- 让旧工程支持iOS5 新的Automatic Reference Counter 语法
- 让旧工程支持iOS5 新的Automatic Reference Counter 语法
- Checkout Counter
- My Counter
- FPS counter
- JavaScript counter
- pulse counter
- Line counter
- hadoop counter
- collections.Counter()
- collections Counter
- Hbase counter
- 4.7 Scene Graph Compilers
- 写一个简单的linq查询语句
- C&&C++群
- lua初学常见问题解惑
- Ubuntu虚拟机设置无线上网
- 18.5 reference counter
- 读取网络文件并按行存储
- Chapte6 Spatial Sorting
- 架构、构件、组件、框架、中间件的区别
- ubuntu ibus输入法实现特殊符号输入
- Java虚拟机内存及调优工具
- 2010年国家公务员考试安排表
- Silverlight工程无法打开的处理方法。
- [代码]元素的附加和克隆(LINQ to XML)