ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Object lifetimes and cleanup(转)

Object lifetimes and cleanup(转)

原创 Linux操作系统 作者:jcszjswkzhou 时间:2019-05-26 21:09:07 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、两部分构建器都属于操作系统的核心。清除堆栈编程有很少的规则,学习它们是相对容易的。参看“清除堆栈基础”来得到更多的信息。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10294527/viewspace-126465/,如需转载,请注明出处,否则将追究法律责任。

上一篇: Boost.Test(转)
请登录后发表评论 登录
全部评论

注册时间:2007-08-29

  • 博文量
    2816
  • 访问量
    2066494