Symbian OS内存泄漏
内存泄漏
From Forum Nokia Wiki
内存泄漏
内存管理在Symbian OS下是一个重要的问题。本页描述有关内存泄漏的问题。
两阶段构造阻止内存泄漏
由于Symbian特殊的错误处理机制:“异出(leaving)”,复合类应当用两阶段来构造以阻止内存泄漏的发生。考虑下面C++风格的对象构造:
CExample* example = new CExample();if (example) { // Do something with example}
首先,在Symbian OS可以使用new操作符的一个重载版本: new (ELeave),若没有足够的可用内存时异出(Leave)。这使得直接使用所返回的指针成为可能,而不必进一步测试内存分配是否成功,简化了代码。
CExample* example = new(ELeave) CExample();// Do something with example
然而,不管是用new还是new (ELeave),因为Symbian的内存异出(Leaving)机制,你必须对内存使用给予特别关注。如果构造函数异出(leave),已经由new操作符分配的内存将发生泄漏,因为没有办法清除它了。因此,C++风格的构造函数与析构函数应该永不异出(leave)。
注意: Symbian OS内存管理的一个关键规则: no code within a C++ constructor (or destructor) should ever leave.
将构造代码分成两个阶段就能避免这个问题:
在第一阶段,执行不会异出(Leave)的代码。实际上,这意味着调用基类构造函数,及不会异出(Leave)的函数等等。一般地,这部分在类的基本构造函数中完成。(当然,若第一阶段的构造函数不异出,那么只使用 new (ELeave)操作符而不用两阶段构造也是恰当的。)
在第二阶段,执行可能发生异出的任何构造部分。实践中,其中包含分配内存、使用诸如文件等资源、调用可能异出的函数等等。一般地,这部分在一个叫ConstructL的类方法中完成。
这两个阶段分开执行,在二者之间,由new操作符分配和构造的对象被压入了清除栈。如果在第二阶段异出(Leave)发生,清除栈就调用析构函数释放已经成功分配的任何资源并销毁给对象本身分配的内存。在Symbian OS中,通用的方式是提供一个包装了二阶段构造的静态函数。一般地,这个函数叫做NewL,或NewLC,后者将构造的对象留在了清除栈中。
这里是一个两阶段构造的例子:
class CExample : public CBase{public: static CExample* NewL(); static CExample* NewLC(); ~CExample();private: CExample(); // Guaranteed not to leave void ConstructL(); // Second phase construction code, may leave};
不会异出的构造函数CExample和第二阶段构造函数ConstructL已被设为私有,这样调用者就不能实例化该类的对象,除了通过NewL (或NewLC)。若你想让你的类子类化,那就应将缺省构造函数设为保护访问(protected)而不是私有(private)访问,这样,编译器就可以构造派生类了。
NewL和NewLC的典型实现如下:
CExample* CExample::NewLC(){ CExample* me = new(ELeave) CExample(); // First phase construction CleanupStack::PushL(me); me->ConstructL(); // Second phase construction return (me);}
CExample* CExample::NewL(){ CExample* me = CExample::NewLC(); CleanupStack::Pop(me); return (me);}
除了对象构造,你也应仔细考察析构代码。
有关析构函数的问题
必须编写析构函数以释放对象拥有的所有资源。然而,若第二阶段构造失败,清除栈将调用析构函数清理被部分构造的对象。因此,析构代码不能假定对象被完全初始化,你应该清楚通过指针调用函数的问题,该指针可能尚未指向有效对象。
这里是一个安全的析构函数的例子。
CExample::~CExample(){ if (iMyAllocatedMember) { iMyAllocatedMember->DoSomeCleanupPreDestruction(); delete iMyAllocatedMember; }}
链接
- 内存管理
- 调试技术
- 非CBase类的清除栈支持
- 异出(Leave)
Symbian OS内存泄漏相关推荐
- Symbian OS内存管理介绍
Symbian OS内存管理介绍 在Symbain OS中内存管理的主要任务是:如何为程序分配内存以及如何在程序的内部分配内存. Symbian OS 程序最根本和基础的东西就是内存,作为一个有限的资 ...
- OS 内存泄漏 导致 整个aix主机block
问题 aix 主机 1.数据库主机使用vmstat 监控,隔几分钟 就是block 爆满. cpu 没有瓶颈,I/O 显示本地磁盘hdisk0和hdisk 1 是爆满. vmstat 同时显示大量pa ...
- Symbian OS 精要
一般诀窍 1.'Symbian 开发师网络'提供大量信息资源,协助您为 Symbian OS 操作系统编写应用程序.您应经常访问 www.symbian.com/developer 网站以便获取最新的 ...
- Symbian OS C++程序员编码诀窍
版权©属于诺基亚公司( 2003年),诺基亚公司保留全部权利 "诺基亚"及"诺基亚科技以人为本"是诺基亚公司的注册商标.Java和所有基于Java的标志是Sun ...
- symbian os:描述符
// // 这是我的第二篇博文,开始学习Symbian c++ // 同大家一起努力 // 谨以此文献给我的最爱 YY女孩(YY 可别想坏了哦) // // --------------------- ...
- Symbian OS 开发的特点(转)
Symbian OS 作为一个专门为手机打造的操作系统与PC的操作系统有着很多根本上的不同.本文就来探索一下这些区别.了解这些区别有助于我们更容易的理解Symbian OS的设计(比如清洁栈,二层构建 ...
- 内存泄漏排查攻略之:Show me your Memory
以下文章来源方志朋的博客,回复"666"获面试宝典 来源| cnblogs.com/yougewe/p/11334342.html java 语言有个神奇的地方,那就是你时不时会去 ...
- Spring Boot“内存泄漏”?看看美团大牛是如何排查的
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来自:美团技术团队,作者: 纪兵 链接:https://tech. ...
- 使用Memory Analyzer tool(MAT)分析内存泄漏(一)
使用Memory Analyzer tool(MAT)分析内存泄漏(一) (2010年05月21日) 发表于 Java博客 前言的前言 :本文是自 2005 年 8 月以来,首次在一个月之内发布三篇文 ...
最新文章
- cmodel模拟器开发
- SQL Server 删除重复记录,只保留一条记录
- SpringBoot整合RabbitMQ测试
- 制作旋转led_LED用蓝宝石衬底及加工工艺!
- supervisor进程管理工具
- What Are You Talking About HDU1075
- 苹果MacOS系统上安装第三方驱动失败/无效
- java 处理unicode_Java与Unicode
- MYSQL----(2) 数据库基础知识
- Mac下使用数据库将Excel数据转换存入.plist
- 区块链软件公司:什么时候区块链技术?
- Hi3559A 开发总结--使用docker
- threejs修改模型旋转轴
- Vizard基础操作
- 全球与中国智能灯市场深度研究分析报告
- MySQL之TPC压缩
- PostgreSQL 访问外部数据库之 postgres_fdw
- hanmming窗和hamming窗的作用
- 使用handeye_calib_camodocal进行手眼标定
- Scrapy爬虫设置代理ip