Symbian 程序内存管理的特点
2010-03-01 16:22:00 来源:WEB开发网一、特点
1、内存少
2、Symbian系统长时间运行不关机,即使重启也要保持某些程序的状态。因此Symbian程序绝对不允许内存泄露。
二、symbian独特的内存管理机制
1、Trap harness (陷阱套)
2、cleanup strack (清除栈)
3、Two phase construction (两阶段构造)
三、Trap harness (陷阱套)
1、异常和TRAP
异常指程序缺少某种资源而发生的错误,异常是不可避免的。
程序发生异常的时候,可以被上层的TRAP捕捉。
void CallFun()
{
TInt err;
//根据返回的err的值可以判断ConstructL是否发生异常。
TRAP(err,ConstructL());
}
void ConstructL()
{
CObject obj = new (ELeave) CObject;
...
}
一个函数命名时带L,说明这个函数有可能发生异常。
2、TRAP 宏,TRAPD宏
TRAP宏和TRAPD宏区别是,TRAPD不需要程序员定义错误参数。
void CallFun()
{
TInt err;
TRAP(err,ConstructL());
}
==
void CallFun()
{
TRAPD(err,ConstructL());
}
TRAP代价很高,因此尽量不要过多嵌套TRAP,函数方法,不要连续使用多个Leave,而是把错误交给调研者。
3、new (ELeave)
new (ELeave) 是对C++的操作符的重载。任何类都可以使用,即当创建类时,如果内存不足失败,则调用User::Leave
CObject *obj = new(ELeave) CObject;
==
CObject *obj = new CObject;
if (!obj)
User::Leave(KErrNoMenory)
;
4、cleanup strack (清除栈)
清除栈是保持分配到堆栈的指针,一单出现异常,系统可以根据清除栈释放程序在堆分配的空间,避免内存泄露。
CClass :: NewL()
{
CClass * self = new(ELeave)CClass();
CleanupStack::PushL(self);
self->ConstructL(); //如果构造失败,则leave
CleanupStack::Pop(self);
return self;
更多精彩
赞助商链接