- 1、本文档共54页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
异常退出和清除栈 简介 Symbian OS 被设计为可以在只有有限内存的设备上良好运行的系统,它使用清除栈来保证在错误发生时不会发生内存泄漏。 Symbian OS 的两个最基本的编程模式是异常退出(Leave)——Symbian OS 上轻量级的异常——和清除栈(Cleanup Stack),它是用来管理发生异常退出事件时的内存资源和其他资源的。 异常退出和清除栈 异常退出: Symbian OS 中轻量级的异常 了解在Symbian OS 在v9之前,并不支持标准C++ 中的异常机制 (try/catch/throw), 而是使用一个轻量级的替代品: TRAP 和异常退出 ,这个机制在Symbian OS v9 中仍然是优先使用的 了解异常退出是 Symbian 错误处理机制中一个很基础的部分,并在整个系统中都使用。 理解异常退出和C语言中 setjmp/longjmp 声明的相似性 认识可以产生异常退出的典型系统函数,包括:User::LeaveXXX()函数和 new(ELeave) 能够列出可以产生一个异常退出的典型场景(比如堆分配时内存不足) 理解 new(ELeave) 机制能保证在不发生异常退出时返回的指针总是正确有效的 为什么不使用标准C++的异常? 最初设计Symbian OS的时候,异常还不是C++标准的一部分 人们发现无论是否有异常被抛出,异常处理支持都会大大增加编译后代码的规模,并带来了运行时存储器的开销。 强调紧凑的操作系统和客户端代码 异常对于 Symbian OS 来说意味着太多的开销 因此,提供了一种简单、轻量级的标准C++中异常机制的替代方法——异常退出(Leave) 异常退出可用来将错误传播它能够被处理的地方 为什么不使用标准C++的异常? Symbian OS v9.x 在 Symbian OS v9.x 以前的版本中, 编译器被明确设定为禁用 C++ 异常处理。 在Symbian OS v9.x 中, 得益于编译器进一步发展, 已经可以支持标准 C++ 异常处理并提供了一个更加开放的环境。 这就使得将现有 C++ 代码移植到 Symbian 平台变得更容易了。 什么是异常退出? 异常退出会终止正在执行的代码 在异常退出发生的地方,并在异常退出事件被捕获的地方恢复代码执行 Symbian OS 里面的TRAP Harness(陷阱套)是一个TRAP宏定义 Leave将栈指针设置成 TRAP 的上下文处,然后跳转到该位置并恢复寄存器的值。 Leave并不会终止线程的执行流程 User::Leave() 或 User::LeaveIfError() 近似于 C++ 中的 throw指令 除了不调用栈中对象的析构函数 TRAP宏 可以看作 try 和 catch 组合 —— 它们将会在后面章节详细讨论 setjmp() 和longjmp() 方法 TRAP 宏和 User::Leave() 类似于标准库的 setjmp() 和longjmp() 方法 调用 setjmp() 将把要跳转到的位置信息保存在跳转缓冲区中 ... 被longjmp()用来决定要执行跳转的目标位置 异常退出行为 异常退出机制仅回收栈中的对象 和C++的异常不同, C++异常机制会调用栈对象的析构函数 如果一个栈对象拥有一个资源,而其资源又必须在析构函数进行回收或释放,那么在发生异常退出时就会产生资源的泄露 这就是为什么T 类和内建类型可以安全地在栈上实例化并使用 T 类被限制成只能拥有内建类型或其他T类的所有权,它不能占有资源,所以也就不需要析构函数 如果发生了异常退出,一个基于栈的 T 类对象将被正确的清除,因为实际上当栈被清空时本来就没有什么事情可做 R 类也可以在栈上分配 ——但是它们必须是“异常退出安全”的 清除栈就是用在这些地方,后面还将简单讨论 什么导致了异常退出? 典型的异常退出函数 如果一个操作不能保证一定能成功执行的话就要使用异常退出机制,比如下面的情况: 分配内存空间——内存不足时导致失败 创建文件——磁盘空间不够导致失败 函数在以下情况也可能发生异常退出: 调用了另一个可能异常退出的函数,并且发生了异常退出 显式调用一个会产生异常退出的系统函数,如 User::Leave() 使用了以 ELeave 为参数的 new 操作符的重载形式 为什么要使用异常退出? C++异常机制在使用时花销太大了,为什么不仅仅是检查一下呢?举例说: 使用 new(ELeave)分配堆内存 Symbian OS 重载了全局的 new操作符以支持异常退出 如果没有足够的堆内存进行分配,可以选择异常退出 使用重载操作符时,可以不经进一步检查而直接使用成功分配内存后返回的指针(没有
您可能关注的文档
最近下载
- MEME-C_Chinese主机中文说明书.pdf
- 2025年第二批陕西延长石油集团所属单位内部遴选及选聘81人笔试参考题库附带答案详解.docx
- 2025年湖南省中考语文试题卷(含答案逐题解析).docx
- 组合导航系统.ppt VIP
- 804-22S804矩形钢筋混凝土蓄水池.pdf VIP
- 2025年国家开放大学电大《高级财务会计》机考8套真题题库及答案 .pdf VIP
- 《活页1+1》四年级下册语文人教版试卷及答案.pdf
- 从“愚昧”到“科学”:科学技术简史(清华大学)超星尔雅学习通网课章节测试答案.docx VIP
- 2025年中考英语作文20篇热点预测+范文 学案.docx
- 国家开放大学《计算机系统与维护》平时作业参考答案.docx VIP
文档评论(0)