在创建实例的时候Symbian C++使用 new (ELeave) 来代替普通的 new , 比如:
CBar *pBar = new (ELeave) CBar;

在创建实例的时候Symbian C++使用 new (ELeave) 来代替普通的 new , 比如:
CBar *pBar = new (ELeave) CBar;
这个用法是考虑到手机特殊的属性:内存一般较小, 经常会有内存不足的情况出现。 在pc上如果内存不足我们就会退出程序, 但是在手机不能那样频繁的退出, 所以内存不足被划分为异常, 需要离开. 下面这个函数就会在内存不足的时候在A行离开:

void FooBarL()
{
CBar *pBar = new (ELeave) CBar; //A
User::LeaveIfError(pBar->Foo()); //B
delete pBar; //C
}

离开 作为异常处理的机制, 存在着一个问题。如果上面这个程序在B行Foo()返回了一个错误值,就会在那一行离开,但是系统为pBar指针分配的内存也就泄漏了。为了解决这个问题, Symbian 程序中频繁使用CleanupStack(清洁栈). 它的典型使用方式如下:

void FooBarL()
{
CBar *pBar = new (ELeave) CBar; //A

CleanupStack::PushL(pBar);
User::LeaveIfError(pBar->Foo()); //B
CleanupStack::Pop();

delete pBar; //C
}

他的作用就是, 在B行之前, 把pBar指针放到清洁栈上, 一旦B行离开了,清洁栈就会自动删除pBar回收内存, 如果B行顺利通过, 就可以通过pop把pBar拿下来了。

CleanupStack 有效地解决了这个潜在的内存泄漏问题, 但是这个方法在一个特殊的情况下不适用。 那就是如果一个类的构建函数离开, 那么new 为它分配的内存就会泄漏。 (构建的顺序是:系统分配内存,然后运行构建函数)

这个问题就导入了下一个概念:two-phase construction (二层构建)
我们的目标是:构建函数在任何情况下不可以离开! 要实现它就必须:
1。 不在构建函数里使用任何L函数
2。 不在构建函数里分配内存
凡是需要以上两个操作的都放到第二层构建函数中:ConstructL. 要把两层构建结合起来,我们需要另一个静态函数,一般为NewL或者NewLC. L大家都知道代表离开,C代表清洁栈, 下面会详细讲解NewLC的方便之处。(在这里向大家推荐一个很不错的英文Symbian 资料网站:www.newlc.com :)
二层构建的基本模式就是:

CHelloWorldBasicAppView* CHelloWorldBasicAppView::NewL(const TRect& aRect)
{
CHelloWorldBasicAppView* self = CHelloWorldBasicAppView::NewLC(aRect);
CleanupStack::Pop(self);
return self;
}

CHelloWorldBasicAppView* CHelloWorldBasicAppView::NewLC(const TRect& aRect)
{
CHelloWorldBasicAppView* self = new (ELeave) CHelloWorldBasicAppView;
CleanupStack::PushL(self);
self->ConstructL(aRect);
return self;
}

void CHelloWorldBasicAppView::ConstructL(const TRect& aRect)
{
// Create a window for this application view
CreateWindowL();

// Set the windows size
SetRect(aRect);

// Activate the window, which makes it ready to be drawn
ActivateL();
}

先看NewLC函数, 它创建一个CHelloWorldBasicAppView的实例, 然后把他放在清洁栈上,然后调用它的第二层构建函数(可以离开的), 然后并没有把实例从清洁栈上取下就返回了。这样的好处就是如果我们用NewLC创建一个对象,然后调用它的可以离开的函数就不必把它放到清洁栈上,因为它已经在上面了。NewL的功能和NewLC 是一样的,只是在返回实例前把它取下清洁栈。一般的C类都提供NewL,不是所有的C类都会提供NewLC.

使用清洁栈需要注意:
1. 成员变量一般不需要放在清洁栈上, 因为当执行可离开的成员函数时,它们所在的类的实例本身就应该放在清洁栈上。 所有的成员变量所占的资源都和此实例共存亡。

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

转载于:http://blog.itpub.net/10294527/viewspace-126298/

Symbian OS 开发初级手册(转)相关推荐

  1. Symbian OS 开发初级手册 (1)(转)

    Symbian OS是当前应用最为广泛的smart phone操作系统. Nokia,Panasonic,Siemens,Sony Ericsson的很多手机都是基于这个系统的. 可惜国内关于Symb ...

  2. Symbian OS 开发初级手册 9(转)

    上课讲了Symbian OS中多线程的使用, 这可我们说说Symbian OS中使用更频繁的一个框架:Active Object(这里简称AO). 上课讲了Symbian OS中多线程的使用, 这可我 ...

  3. Symbian OS 开发的特点(转)

    Symbian OS 作为一个专门为手机打造的操作系统与PC的操作系统有着很多根本上的不同.本文就来探索一下这些区别.了解这些区别有助于我们更容易的理解Symbian OS的设计(比如清洁栈,二层构建 ...

  4. symbian系统开发教程(一)

    第一章:Symbian OS简介 作者:谢兴        enigma19971@hotmail.com                                         ---转载需 ...

  5. Symbian OS简介

    原文地址:http://blog.csdn.net/wh_xiexing/archive/2007/11/15/1887002.aspx 1.1.    Symbian系统简介        当前有很 ...

  6. symbian系统开发教程(一) 1

    第一章:Symbian OS简介 作者:谢兴        enigma19971@hotmail.com                                         ---转载需 ...

  7. Carbide.c++ For Symbian 搭建开发环境

    在搭建开发环境之前,首先我们下载需要的SDK及辅助工具. 1. 下载perl,SDK要求的版本是5.6.1版的,只能是这个版本的,版本高了或低了都可能导致搭建环境的不成功,下载地址:http://ww ...

  8. Symbian S60开发环境搭建

    一.准备工作 1. 下载perl,必须用5.6.1版,版本高了或低了都可能导致搭建环境的不成功 下载地址:http://www.activestate.com/ 2. 下载java的运行环境,要求是1 ...

  9. Symbian OS on E65应用开发手记(3)——SDK注册及14天学习总结

    在环境搭建完成14天以后,今儿竟然神奇地提示我SDK已过期,需要注册--真吓人,你干吗我刚安装完的时候不提示我注册啊?折腾我!!!还以为我会从此找不到序列号,从此用不了了呢... 注册方法如下: 在对 ...

最新文章

  1. linux tcpdump monitor模式 抓不到包 解决办法
  2. 给列名称命名_批量提取文件名,然后换上新名称
  3. AOE网的关键路径的计算
  4. 截断正态分布(Truncated normal distribution)nn.init.trunc_normal_
  5. datagridview 排序后 选择不变_排序算法之插入排序
  6. substring substr slice 区别
  7. 开机加电到系统打开究竟发生了什么?(1)
  8. [Java][Android] 多线程同步-主线程等待所有子线程完成案例
  9. java数组使用实验报告_Java实验报告二数组.doc
  10. android 广播 源码,广播电台APP源代码 电台APP源代码 播客APP源代码 Android源代码...
  11. Excel数据分析项目——电商数据分析实战
  12. 关于python函数参数的描述中、错误的是_在Python中,以下关于函数的描述错误的是哪一项?...
  13. RMAN delete noprompt obsolete参数研究
  14. 我们的时空之旅(一)——丽江古城
  15. 大学计算机考试知识点归纳总结,大学计算机基础重点归纳.doc
  16. Java实现会员和非会员,如何选择会员和非会员功能?
  17. No changes detected报错解决方案
  18. 什么是消息补偿机制?
  19. 【STL】string详解(string类常用的操作函数、构造函数、赋值操作、子符串的拼接、查找和替换、比较、存取、插入和删除、获取)
  20. 开源库OGR的入门知识

热门文章

  1. 前端拖拽drag的使用
  2. Spark大数据平台应用实战
  3. 解决某些软件检测不到java环境问题
  4. centos7 编译安装ffmpeg + x264 + acc + yasm
  5. VSCode代码格式化快捷键
  6. WIN10下OpenCV4.1.0与VS2017安装
  7. 为Fabric 1.4.4 first-network 添加PBFT排序算法
  8. 数据库的8种优化方式
  9. 2020年河南省对口升学计算机专业分数线,2020年河南省对口升学考试和录取
  10. 不锈钢无缝钢管重量计算公式