内存管理
Contents |
Symbian OS的一个基本特征是为具有有限内存容量和可用资源的设备而设计的。因此,它需要非常有效的内存管理。由于缺少资源,任何应用都有可能发生运行时错误: 比如,机器内存用完了或者访问硬件资源失败。这些错误被认为是异常(Exception),不可能通过修改程序阻止它们的发生。所以,程序应当能够在异常发生时恢复。
这样,对于Symbian OS来说,好的内存管理的关键需求如下:
在栈上:
在堆上:
例子:
TInt i = 0;
CMyObj* obj = new (ELeave) CMyObj;
这里,i存储在栈上,而obj指向堆内存。
对象在栈上声明时,对象离开其作用范围时被自动删除。缺省的栈大小是8Kb,但可以在项目中(.mmp文件)用epocstacksize声明增大这个值。项目文件中的使用会被后续模块覆盖掉。(注: 使用Emulator时,变更栈大小不起作用。)
作为对照,对象在堆上自动分配时,它需要由程序员使用delete关键字明确删除。若未删除,则发生内存泄漏。在给定设备上,堆的大小会随着可用内存而变化,但应超过0.5Mb。
异出(Leave)例子
return new (ELeave) TUint8[100];
User::Leave(KErrNotFound); // from e32std.h
User::LeaveNoMemory();
void CMyClass::SetCallbackL(MNotify* aNotify)
{
User::LeaveIfNull(aNotify);
...
RFs fileServer; // handle to file server
TInt error = fileServer.Connect();
User::LeaveIfError(error);
使用清除栈
CleanupStack::PushL(ptr) 用于指针——在异出事件中所指内存将被删除。
CleanupClosePushL(handle) 用于句柄——在异出事件中句柄将被关闭。
CleanupStack::Pop(pointer) 移除顶部条目
CleanupStack::PopAndDestroy(pointer) 移除并删除/关闭条目
• 对象被一个本地指针引用,且仅当 • 在该对象生命周期内调用了一个会异出(Leave)的函数
例子:
这里,若ConstructL()异出,self将被自动删除:
CMyClass* CMyClass::NewL(TInt aBufSize)
{
CMyClass* self = new (ELeave) CMyClass;
CleanupStack::PushL(self);
self->ConstructL(aBufSize);
CleanupStack::Pop(self);
return self;
}
NewL()和NewLC()
这两个静态函数一气呵成执行两个构造阶段。提供New()或NewLC()为类的一部分使得这个类用起来更容易。NewLC()被典型用在某个函数含有一系列的自动变量(指向堆内存),省得将每一个推入清除栈。
No related wiki articles found