Symbian的内存管理

异常退出:

        异常退出是Symbian特有的一种异常处理机制。异常退出函数与TRAP和TRAPD宏配合使用。异常退出函数是执行了并不保证一定成功的操作。在异常退出函数名称尾部加上“L”以说明。和C++不同,Symbian里没有throw...catch块。异常退出相当于throw,TRAP/TRAPD宏相当于catch。如果有错误发生,软件调用异常退出。当异常退出发生时,程序沿调用栈返回,直到有TRAP/TRAPD宏捕获,依照捕获的异常退出码进行处理。


    析构函数作为清理工作的组成部分,不允许异常退出。所有有可能产生异常的操作均不能在析构函数中调用。


    在构造函数中,可以使用 new(ELeave) 版本的重载 new 操作符动态地构造对象。new(ELeave) 保证执行完成后对象能够成功地构建,否则异常退出,不需要程序员再对内存进行处理。

 


 

清除栈:

    清除栈是一种特殊的栈,栈中保存有可能产生异常退出对象的指针。在为有可能产生异常退出的指针分配了内存空间以后,应当立即将该指针压入清除栈。在该指针对象生命周期结束之前,将其从清除栈中弹出或销毁。

    当压入清除栈的对象是CBase类型的指针,以Push(CBase*  aPtr)版本压栈,清理时自动调用CBase的虚析构函数;如果是非CBase类的指针,则以Push(TAny* )重载压栈,清理时只是简单地释放该指针指向的内存空间。

    PushL( )不会发生异常退出。在执行Push时,清除栈中已经有一个元素的空白空间。先将指针保存在该空间中,然后申请新的空间,如果不成功,则指针已经保存,发生异常退出,可以正确清理。

 



二次构造:

    在Symbian中,构造函数不允许异常退出,而有些对象在构造的时候需要进行资源分配等操作。这样的话就有可能出现异常退出。Symbian使用二次构造来解决这个矛盾。
    Symbian通过NewL( )和NewLC( )工厂函数来构造对象。在工厂函数里,调用了C++构造函数和二次构造函数,同时进行清除栈的操作。在C++构造函数中,不允许出现有可能产生异常的操作,而这些操作全部放在二次构造中进行。
    使用C++构造函数分配了空间之后,立即将该指针压入清除栈,之后进行二次构造。即使二次构造失败,该对象的指针已经被压入清除栈,能够正常清理。
    在二次构造成功执行后,可以将该对象指针从清除栈中弹出,或是直接返回该对象指针。NewL( )构造完对象后,从清除栈弹出指针,而NewLC( )则将指针保存在清除栈中,直接返回对象指针。可能通过NewL( )中调用NewLC( )来实现。


    Symbian的这些复杂的内存管理机制,都是因为Symbian是运行于小型设备上的操作系统。这类设备的内存资源是非常宝贵的,绝对不允许浪费。况且手机和电脑不一样,电脑关机后,几乎所有的设备都断电,而且不会长时间保持开机状态,重新启动后内存等设备可以成功清零。而手机要长时间保持开机状态,就算关机也有部分进程处于运行状态。如果发生内存泄露,恐怕除了格机,就没有方法释放了。所以,内存管理在Symbian中显得尤为重要!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值