Symbian OS入门指南--错误处理和清理

原创 2004年12月30日 17:47:00

摘要:错误处理和清理工作对于Symbian OS环境下的开发显得尤为重要。错误处理(error handle)实际上是为了编写出更可靠的程序,而清理(cleanup)框架则是Symbian OS的编程基础,正因为如此,必须保证错误处理和清理非常有效且易于实现。

OOM(out-of-memory)错误在Symbian OS环境下则不得不谈。目前的台式机内存的容量越来越大,加上更大硬盘上创建的虚拟内存,而且使用者可能进行经常性的重启。在这样的情况下,内存耗尽很少发生。而在Symbian OS的环境下,RAM少到只有4MB,一般也不会超过16MB,使用时经常要求不必重启。所以我们在Symbian OS环境下开发要注意以下问题:

必须高效编程,使程序不会浪费RAM。
必须尽快释放资源,因为不可能不释放资源,让运行程序消耗越来越多的RAM。
必须处理内存不足错误。在Symbian OS中这类错误可以随机发生。
若出现内存不足错误,导致某些操作停止,一定不能丢失用户数据。
若某个要分配若干个资源的操作中途发生了内存不足,必须清理所有这些资源。

实际上Symbian OS的错误处理和清理框架并不只对OOM错误有效,很多其他操作因为其环境条件可能失败,比如读写文件、打开文件,在通信会话中发送和接受数据。也可以使用错误处理和清理框架来处理。

下面列举一些用于处理内存不足错误和测试OOM的工具:

最普通的调试键
    常用的Ctrl+Alt+Shift+(A使用堆单元、B文件服务器资源、C窗口服务器资源)
堆检查工具,用来检查函数分配的资源是否释放
C++的析构函数来销毁对象
堆失败工具,故意产生错误
异常退出机制,用来指示错误。其中一个基本函数User::Leave()
清理栈
异常捕获装置:用陷阱捕获异常退出的过程,类似与C++中的try-catch机制
CBase类,所有C类的基类,由清理栈来识别,包含一个C++析构函数
双阶段构造函数
命名约定

以上所述的工具接下来部分会做一介绍:
堆检查:
主要是使用宏_UHEAP_MARK和_UHEAP_MARKEND。
宏_UHEAP_MARKEND主要在析构函数中调用,此时在程序中任何位置如果包含了宏_UHEAP_MARK,则可以检查中间的堆操作是否平衡,就是说如果堆单元的数目和调用_UHEAP_MARK时数量不同,程序就会出错。
析构函数
想大家都不陌生,只是简单提一下
程序中使用过的对象,并不是所有的都要在析构函数中去释放,所销毁的只是自己所拥有的对象,也就不包括临时生成的局部变量。
堆失败工具
这个工具主要用来处理内存不足的错误,有个名为memorymagic的应用程序就是这个作用的,但不是所有的symbian系统都有相应的这个应用
具体使用方法可以到symbian的官方网站上下载这个东东,里边有相应的使用说明。
异常退出机制
当然就是使用User::Leave()来根据不同的错误码(请参照本blog中的Symbian错误码)异常退出,User::Leave()函数可以让活动函数的运行终止,并且接着终止所有调用函数。
清理栈
清理栈解决如下问题:清理栈在堆上分配的,但是指向它的唯一指针却是自动变量的对象。如果分配对象的函数异常退出,则需要清理对象。例程
case EMagicCmd:
{
    CX* x = new (ELeave) CX;
    CleanupStack::PushL(x);
    x->UseL();
    CleanupStack::PopAndDestroy(x);
}
上述例程无论UseL()运行是否异常,程序都可以正常退出,因为作为异常处理的一部分,弹出并销毁清理栈上的所有对象是必须完成的。当然你也可以这么做
case EMagicCmd:
{
    CX* x = new (ELeave) CX;
    TRAPD(error,x->UseL());
    if(error)
    {delete x;
     User::Leave(error);
    }
    delete x;
}

注意:没有必要不要使用清理栈
我们只需要使用清理栈来阻止越过对象的析构函数,如果该对象的析构函数一定会被调用,那么就一定不要使用清理栈。
一般来说类的成员变量往往都可以被类自身的析构函数销毁,所以绝对不应该把成员变量推入清理栈,避免二次删除!

两阶段构造
清理栈用于保存指向基于堆的对象的指针,以便发生异常退出时进行清理。这意味着,必须有机会来把对象推入清理栈。这个问题就可以利用两阶段构造来解决。

首先请记住C++的构造函数不应该包含任何可能异常退出的函数。例程:
class CY : public CBase
{
public:
CY();
~CY();
public:
CX* ix;
CY:CY()
{
ix = new(ELeave) CX;
}
CY:~CY()
{
delete ix;
}
}
调用
CY* y = new(ELeave) CY;
CleanupStack::PushL(y);
...
CleanupStack::PopAndDestroy(y);
这个时候在分配CY的过程中,同时要分配一个CX,由于构造函数CY()没有异常处理机制,因此一旦分配CX失败,则得到内存泄漏错误,因此需要利用一个完全独立的函数来实现这个。于是就定义了ConstructL()
class CY : public CBase
{
public:
~CY();
static CY* NewL();
static CY* NewLC();
void ConstructL();
public:
CX* ix;
CY:~CY()
{
delete ix;
}
}

void CY:ConstructL()
{
ix = new(ELeave)CX;
}
调用改为:
CY* y = new(ELeave) CY;
CleanupStack::PushL(y);
y->ConstructL();
...
CleanupStack::PopAndDestroy(y);
很显然这时ConstructL()能够安全清理。

一些经验小节:
对象不可分配两次, 不可删除两次。
delete ib;  //加上
ib = NULL;  //加上
ib = new CB;
不要删除非拥有对象
决不要从C++构造函数中异常退出。
使用好命名规范,帮助自己理解程序。
用好清理栈。
用好宏TRAPD()同User:Leave()。
-----------------------------------------------------------
总之,Symbian OS下的错误处理和清理是异常复杂和难以琢磨的,只有用我们细心加耐心去慢慢克服。

                                                                        --风小云原创

最简洁搭建Symbian os C++移动开发环境

Symbian支持的语言很多,WEB,Flash,python,java ,P.I.P.S,Symbian C++综合而言,C++开发出来的程序功能最强,性能最好,最接近底层,很灵活。如果你选择J2M...
  • holymoonshine
  • holymoonshine
  • 2010年01月23日 16:59
  • 386

Symbian OS应用开发-SMS的故事(二)

摘要:上节我们了解了Symbian OS中对SMS的主要操作,比如新建、修改以及删除等等,这篇文章我们主要认识一下有关SMS的发送。发送SMS也许我们大多数人都操作过,简单说来就是编辑一段文本,然后选...
  • welcome_ck
  • welcome_ck
  • 2005年01月28日 17:31
  • 5338

Symbian OS 源码获得方式(本站原创)

 --由www.j2megame.com原创。在www.Symbian.org网上逛了下,发现只有1个链接 http://tiny.symbian.org/open 指向开源下载,但是该页面不知为何原...
  • dymx101
  • dymx101
  • 2010年03月17日 14:57
  • 504

Symbian OS 源码下载方式

本文由 www.J2meGame.com 撰写,转载请说明。Symbian OS 源码下载方式,导航:近日Symbian OS开源,肯定有很多移动开发爱好者去下载Symbian系统代码。但是笔者发现S...
  • wag2765
  • wag2765
  • 2016年01月25日 16:41
  • 583

Python 2.7入门指南(官方中文)

http://wenku.baidu.com/view/53187e0daf45b307e8719799.html?from=search
  • zerokkqq
  • zerokkqq
  • 2016年11月02日 20:51
  • 521

EmguCV入门

EmguCV入门 1. 简介 EmguCV即C#语言下的Opencv。Opencv中的函数经过封装,使得用C#语言编程时也可以很方便的调用。两者之前的对应关系可参见EmguCV入门指南。 2. 下...
  • xywy2008
  • xywy2008
  • 2014年01月17日 20:07
  • 3024

《cloudstack》入门指南记录

1、使用Transifex翻译文档 www.transifex.net网站 2、云计算的3种服务模式: SAAS:软件即服务 PAAS:平台即服务 IAAS:基础架构即服务 3、向下管理 ...
  • stray82
  • stray82
  • 2016年01月18日 14:19
  • 274

Java初学者入门指南

跟其他语言相比,大家或许会觉得Java很难,因为Java一开始给人的感觉就不是平易近人和蔼可亲的,甚至对于从未接触过Java的人而言,Java是非常难上手的。其实,完全是一种偏见,Java的入手,可以...
  • u010619705
  • u010619705
  • 2013年05月29日 11:45
  • 522

学习Symbian的开始

需求一台电脑,相当快的处理器(大于1.5GHz),512M甚至更大的内存,最少有2G大小可用空间的硬盘存储,操作系统是Windows 2000,XP 或者Vista。开发软件来编译程序,编写程序。即I...
  • mmchsusan
  • mmchsusan
  • 2007年07月24日 23:20
  • 598

《webgl入门指南》学习笔记一three.js与sim.js

最近又一次很久木有更新博客了,但是不是停了,而是一次性更新了太多,想清楚了自己水平有限,不想误导大家,所以就把这里单纯的当做自己的学习笔记。 上次让立方体转起来了,这次我们就直接介绍一个框架《webg...
  • Chase_freedom
  • Chase_freedom
  • 2015年06月25日 23:06
  • 1917
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Symbian OS入门指南--错误处理和清理
举报原因:
原因补充:

(最多只允许输入30个字)