内存泄漏

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)访问,这样,编译器就可以构造派生类了。

NewLNewLC的典型实现如下:

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)
Retrieved from "http://wiki.forum.nokia.com/index.php/%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F"

Symbian OS内存泄漏相关推荐

  1. Symbian OS内存管理介绍

    Symbian OS内存管理介绍 在Symbain OS中内存管理的主要任务是:如何为程序分配内存以及如何在程序的内部分配内存. Symbian OS 程序最根本和基础的东西就是内存,作为一个有限的资 ...

  2. OS 内存泄漏 导致 整个aix主机block

    问题 aix 主机 1.数据库主机使用vmstat 监控,隔几分钟 就是block 爆满. cpu 没有瓶颈,I/O 显示本地磁盘hdisk0和hdisk 1 是爆满. vmstat 同时显示大量pa ...

  3. Symbian OS 精要

    一般诀窍 1.'Symbian 开发师网络'提供大量信息资源,协助您为 Symbian OS 操作系统编写应用程序.您应经常访问 www.symbian.com/developer 网站以便获取最新的 ...

  4. Symbian OS C++程序员编码诀窍

    版权©属于诺基亚公司( 2003年),诺基亚公司保留全部权利 "诺基亚"及"诺基亚科技以人为本"是诺基亚公司的注册商标.Java和所有基于Java的标志是Sun ...

  5. symbian os:描述符

    // // 这是我的第二篇博文,开始学习Symbian c++ // 同大家一起努力 // 谨以此文献给我的最爱 YY女孩(YY 可别想坏了哦) // // --------------------- ...

  6. Symbian OS 开发的特点(转)

    Symbian OS 作为一个专门为手机打造的操作系统与PC的操作系统有着很多根本上的不同.本文就来探索一下这些区别.了解这些区别有助于我们更容易的理解Symbian OS的设计(比如清洁栈,二层构建 ...

  7. 内存泄漏排查攻略之:Show me your Memory

    以下文章来源方志朋的博客,回复"666"获面试宝典 来源| cnblogs.com/yougewe/p/11334342.html java 语言有个神奇的地方,那就是你时不时会去 ...

  8. Spring Boot“内存泄漏”?看看美团大牛是如何排查的

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来自:美团技术团队,作者: 纪兵 链接:https://tech. ...

  9. 使用Memory Analyzer tool(MAT)分析内存泄漏(一)

    使用Memory Analyzer tool(MAT)分析内存泄漏(一) (2010年05月21日) 发表于 Java博客 前言的前言 :本文是自 2005 年 8 月以来,首次在一个月之内发布三篇文 ...

最新文章

  1. cmodel模拟器开发
  2. SQL Server 删除重复记录,只保留一条记录
  3. SpringBoot整合RabbitMQ测试
  4. 制作旋转led_LED用蓝宝石衬底及加工工艺!
  5. supervisor进程管理工具
  6. What Are You Talking About HDU1075
  7. 苹果MacOS系统上安装第三方驱动失败/无效
  8. java 处理unicode_Java与Unicode
  9. MYSQL----(2) 数据库基础知识
  10. Mac下使用数据库将Excel数据转换存入.plist
  11. 区块链软件公司:什么时候区块链技术?
  12. Hi3559A 开发总结--使用docker
  13. threejs修改模型旋转轴
  14. Vizard基础操作
  15. 全球与中国智能灯市场深度研究分析报告
  16. MySQL之TPC压缩
  17. PostgreSQL 访问外部数据库之 postgres_fdw
  18. hanmming窗和hamming窗的作用
  19. 使用handeye_calib_camodocal进行手眼标定
  20. Scrapy爬虫设置代理ip

热门文章

  1. 温故而知新!java面试思维逻辑题
  2. 绘制linspace函数图像均分计算指令
  3. 使用vscode查看Hex或UTF-8编码
  4. 为影驰主板运行Windows11开启fTPM2.0(Intel PTT)可信计算支持
  5. Robotic Process Automation 机器人流程自动化(2)
  6. 万字长文教你消息中间件到底该如何选型?
  7. html去重三种方法,sql语句_ 的三种去重方法
  8. 动态代理模式和动态代理失效原因简介
  9. 医院管理系统完整项目代码以及数据库建表语句分享(包括加盐和拦截器)
  10. Redis缓存穿透、击穿、雪崩面试题详解