系统内存有内存管理单元(MMU)管理。Symbian主要分为以下几类:
1. MMC: 可读/写存储介质,用于用户数据,程序代码。
2. ROM: 只读存储器,用于操作系统代码,系统所需数据。
3. RAM: 主内存,用于处理栈,处理堆,存储全局变量,作为操作系统栈造作系统堆。
1. 内存分配方式:
1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。缺省大小是 8Kb。
3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
4) 内存泄漏是由于资源使用完后,没有释放或释放不成功造成的。
2. Leave
1) Leave 是一种异常处理机制。
2) Symbian OS 引入了Leave的概念,替代C++中的异常处理。若内存空间或资源得不到成功分配,那么就会产生Leave.如果Leave在某个函数中发生了,那么它也将在所有调用该函数的函数中发生,直到有相关的函数处理这个Leave.如果应用程序中没有函数来处理这个Leave,那么系统就会执行一些默认的处理操作。
3) Leave 和 TRAP是Symbian 中的异常处理机制。
4) 如果一个函数可能发生Leave,那么就需要在函数名字后面加上后追“L”,在调用函数时很容易知道那些函数可能发生Leave。
5) 宏TRAP和TRAPD用于处理Leave。
3. 清理栈
1) 清理栈是Symbian OS提出的处理内存泄漏的方法。
2) 基本原理:保存那些在发生Leave时需要释放的局部变量,这样如果函数发生Leave,那么清理栈里的所有对象都会被自动删除。
3) 入栈:Cleanup stack::PushL(ptr)—用于指针入栈,若发生Leave,ptr指向的内存会被删除。
CleanuoClosePushL(handle)—用于句柄,若发生Leave,句柄会自动关闭。
4) 出栈:CleanupStack::Pop(pointer)
或CleanupStack::PopAndDestroy(pointer)
5) 如果一个函数在退出时,需要将对象放置在清理栈中,那么函数的名字后面应加上后追“LC”
4. 二阶段构造
1) 二阶段构造函数提出的目的是为了解决构造函数资源分配问题。
2) 基本思想:将不会发生异常的代码放在普通的构造函数中;把可能发生异常(进行动态内存资源分配)的部分放在二阶段构造函数中。
3) 建议:所有自定义的C类都应该定义NewL()和NewLC()函数,并且都是公有静态函数;同时定义私有的二阶段构造函数和C++构造函数。
4) 构造方面:
Ø 普通构造函数不能包含能发生Leave的代码;
Ø 可能发生Leave的代码放在二阶段构造函数中;
Ø 成员变量的初始化可以有两个构造函数的任何一个来完成;
Ø 若基类有二阶构造函数ConstructL(),那么在派生类的构造函数ConstructL()中必须调用它,并且通常在最开始的时候进行;
5) 析构方面:
Ø 删除空指针没有什么影响;
Ø 删除对象后,应将其指针设为空;
Ø 在删除对象,并将其指针设为空后,再进行内存分配;