C++引用计数的智能指针有效回收方法
日期:2007年9月18日 作者: 查看:[大字体 中字体 小字体]-
引用计数指针是否能有效地回收,对系统意外关机之后数据的恢复来说至关重要,关键是要避免对象复制。
怎样从灾难性故障中,恢复一个长期运行、系统级的后台守护进程或者服务,在如今的软件设计过程中,已成为了一个重要的考虑因素。当这些软件是由C++语言编成,并使用了引用计数的智能指针时,那么,智能指针的有效回收,对系统是否具有可伸缩级的恢复能力、甚至正确地继续未完成的操作来说,都显得至关重要。
在本文中,描述了一种方法,可从关机之后的软件恢复中,有效地回收引用计数指针,而且此方法在内存占用方面也非常高效,这种方法的关键在于避免对象复制,而对象复制通常是由C++中指针引用的串行化与反串行化这种传统技术产生的。当从存档文件中反串行化时,本方法使用了标记(tag)来唯一地识别指针对象,且在系统恢复时由一个对象缓存来保存指针引用。
本文以一个基于事件的商业实时作业调度系统来进行演示,其通常由大型市场咨询公司使用,每天都会在集群工作站上处理数不胜数的计算任务。
为什么许多C++软件项目会使用自动内存管理技术呢,因为它有以下好处:
² 代码安全性。避免了太早释放一个对象所带来的风险。
² 代码正确性。避免了忘记释放未使用内存所带来的风险。
² 代码模块性。代码中不再需要点缀着与程序无关的簿记代码。
² 编程简单性。现在可假定一种无限内存的计算模式。
² 编程高效性。程序员不再担心内存管理问题。
引用计数智能指针,有时也称为“计数体术语”,是一种生命期受管的对象,其对引用它的数量,有一个内部的计数器。当内部引用计数为零时,这些对象会自动销毁自身,这是一种非常有用的技术,已运用在许多C++软件产品项目中,因为简单易行,且无需对语言或编译器进行任何扩展。
引用计数智能指针能进一步定义为一体式或分离式,一体式智能指针把引用计数放在自身内,而分离式智能指针则把引用计数放在对象之外。在本文中,使用的是分离式智能指针方案,这需要在访问实际对象指针之前,在智能指针模板对象中重载 -> 或 * 操作符,从本质上来说,这也是代理(Proxy)设计模式的一个特例。
就目前来说,还没有一种方案以高效利用内存的方式描述了怎样恢复智能指针,而传统的C++对象串行与反串行化方法,会导致内存低效,因为当一个反串行化的对象遇到一个对它的引用时,总是会创建一个新对象,在最坏的情况下,这会把一个恢复后的守护进程的内存消耗量,推到一个无法接受的高度,致使它无法继续运行下去。
问题的引出
传统对象的串行与反串行化方案,也能实现智能指针,只不过在内存上比较低效而已。在这些传统方案中,当一个对象串行化时,对象内的成员指针被解引用,它的内容与对象一起“串行”进存档文件中。这种方法的问题在于,当反串行化时,成员指针会再次构造,且是每个恢复的对象都会这样。
下面以基于事件的作业调度系统来进行讲解,作业定义在CJobDef对象中,其包含了作业的静态属性,如它执行的命令、工作目录、及作业执行时的用户ID。而作业定义的运行实例则包装在CJobInst对象中,其包含了一些与实例有关的属性,如它的进程ID、执行参数、及运行历史记录。在类层次上,每个CJobInst对象都包含了一个成员,其引用到触发这次作业实例的原始CJobDef对象。
图1是软件停止运行之前的系统,运行时CJobInst对象的多个实例可能会引用至同一个CJobDef对象。在软件停止及恢复后,传统串行化对象恢复方法,会导致为每个运行的CJobInst对象,都创建一个CJobDef对象,如图2中所示。

图1:恢复之前的对象图

图2:内存低效恢复之后的对象图
这种情况发生在传统的C++类对象中指针成员串行化与反串行化时,例1,是一段带有重载>>与<<操作符,串行及反串行化CJobInst与CJobDef类指针的CArchive类代码,也证明了这点。例1:
以下是引用片段:
- [1] [2] [3] [4] 下一页
-
- C++引用计数的智能指针有效回收方法 相关文章:
- ·C++引用计数的智能指针有效回收方法
- C++引用计数的智能指针有效回收方法 相关软件
- 特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作
- 者.文章版权归文章原始作者所有.对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转
- 载的文章有版权问题请联系编辑人员,我们尽快予以更正. 转载请注明来源:http://www.hackhome.com
上一篇:微软HD Photo数字照片文件格式可能取代JPEG
精品推荐
热点TOP10
- ·C语言教程第六章:指针
- ·C/C++笔试、面试题目大汇总
- ·MSComm控件使用详解
- ·学生成绩管理系统实习
- ·Windows下C语言网络编程快速入门
- ·飞机订票系统设计
- ·c#.net连接access操作类
- ·进程调度模拟程序
- ·打字游戏
- ·C#基础概念二十五问
- ·makefile规则
- ·C语言的常用库函数使用方法分析及用途
- ·Windows编程基础 - 概述
- ·c语言中的结构(struct)和联合(union)简介
- ·一个简单的链表程序
- ·GDB 的文档
- ·漫谈C++ Builder多线程编程技术
- ·VC下调用ACM音频编程接口压缩Wave音频
- ·C语言教程第五章:函数
- ·ASP.NET在线用户列表精确版——解决用户意外退出在线列表无法及时更新问题
特别推荐
- ·C#基础概念二十五问
- ·利用C#远程存取Access数据库
- ·入门教程:实例详解C++友元
- ·C语言基础教程(三)输入输出函数及控制流程语句
- ·VC下调用ACM音频编程接口压缩Wave音频
- ·如何在C/C++中调用Java
- ·设计的一个计算器类的源代码,很简陋哦,请各位高手不要见笑!
- ·gSOAP中内存的使用
- ·Windows下C语言网络编程快速入门
- ·C语言教程第六章:指针
- ·漫谈C++ Builder多线程编程技术
- ·学生成绩管理系统实习
- ·用C#实现pdf文件的完整性验证
- ·将程序从托管扩展 C++ 迁移到 C++/CLI(1)
- ·链表的c语言实现(六)
- ·C语言库函数 (D类字母)
- ·用AVIFile函数制做AVI文件基本步骤
- ·利用C++实现的贪吃蛇游戏
- ·Windows API-GDI入门基础知识详解(3)
- ·C语言库函数 (C类字母)
