Symbian翻译 之 Object lifetimes and cleanup

类别:编程语言 点击:0 评论:0 推荐:
注释:因为C++ and machine architecture、Object orientation
basics这两个章节主要讲的是C++的编程方法,所以在我的文档里面,这些部分被CANCEL了。
Overview
  不管是在堆栈还是堆,对象都有自己的生命期,具体如下:
  1、给对象分配内存[堆栈或者堆]
  2、初始化:也就是给对象所在的内存赋值
  3、使用对象
    4、清除:释放对象使用的各种资源
  5、释放对象所占的内存[从堆栈或者堆]
  对象的生存期是一个基础概念。在某些操作系统,它是可以忽略的,因为程序中止的时候,堆栈和堆都会被销毁。但是在Symbian平台,程序往往需要能运行数个月。这就是为什么对象在生命期结束的时候就必须马上清除所有内存是那么重要的原因,不管它们分配在堆栈还是堆,不管它们生命期的结束是因为正常处理还是因为错误。
Lifetimes in C
从略
Lifetimes in C++
从略
Lifetimes in the Symbian platform
  Symbian的堆栈上的对象的生命期和标准C++的很象。但是堆上面的对象的生命期的控制和标准C++非常不同,参看下面的代码:
  void FooL()

  {

        CS* s=new (Eleave) CS; // allocate and check 分配并且检查

        CleanupStack::PushL(s); // push, just in case  入栈

        s->ConstructL(p1,p2); // finish constructing - might leave    完成构建 可以会产生leave

        s->UseL(p3,p4); // use - might leave    使用 可能会产生leave

        CleanupStack::PopAndDestroy(); //
destruct, de-allocate 析构,清除内存

  }
    这个代码展示了四件重要的事儿:

所有的基于堆的类的名字都必须用C开头:实际上它们都继承自一个唯一的基类CBase,这基类提供了简化清除过程的功能。
“清除堆栈”用来保存对象的引用:如果由于内存耗尽或者其他错误造成leave发生,清除堆栈里面的对象会弹出并且摧毁。在这种情况下,压入在清除堆栈的CBase*对象,可以通过调用它们的C++析构器来摧毁。CBase类有一个虚拟的析构器(CBase::~CBase)是这个行为成为可能。
任何可能产生leave的函数的名字都必须用L结尾。当你看到一个函数可能leave的话,你必须问问如果leave会怎么样,如果不的话又会发生什么。操作系统提供了所有程序的底层结构来支持对象在发生leave的时候释放空间,而不需要给程序员更多负担。
new(ELeave)是new操作符的重载,在分配内存的时候将会leave。它不会返回null指针。

    两件其他的事情值得注意:

由于清除堆栈本身的每个堆栈帧也是需要内存分配的,所以压栈(push)也是可能会leave的。PushL()这个函数名也说明了这点。清除堆栈保证在调用CleanupStack::PushL()之前有剩余的空间,所以对象引用总是能成功的保存在清除堆栈里。如果在分配下一个堆栈帧发生leave,对象会弹出而且摧毁。
C++构建器一定不能产生leave。对于那些构建过程需要资源分配的,或者任何操作可能失败的堆想来说,必须把构建器的代码分成,不会产生leave的构建器和另外可能会产生leave的初始化函数,通常这个初始化函数叫做ConstructL()。

    清除堆栈、CBase、两部分构建器都属于操作系统的核心。清除堆栈编程有很少的规则,学习它们是相对容易的。参看“清除堆栈基础”来得到更多的信息。

本文地址:http://com.8s8s.com/it/it28948.htm