Symbian中new (ELeave)和内存管理

来源:百度文库 编辑:神马文学网 时间:2024/04/29 23:37:32
在Symbian当中需要使用二阶段构造,这是区别于普通C++的特点之一。为什么需要这么做呢?需要先来看看普通C++是如何做的。
在普通C++当中,构造一个对象使用new操作符,当然有的时候new操作是会失败的,比如没有足够的空闲内存用于分配等等。为了避免这样的失败对系统造成影响,普通C++中有个new_handler来专门处理内存分配失败的情况。基本上new_handler是一个函数指针,指向的函数是专门用来处理。这个函数基本上需要做以下一些事情:
1.设法使更多的内存可用
2.尝试使用另外的new_handler
3.抛出异常
这样做能够在最大程度上保证程序不会由于new出错而崩溃。而在Symbian中似乎没有这个new_handler的概念,new也不会抛出异常(可能是因为完整的异常处理机制对于移动设备来说太昂贵了)。这是通过重载new操作符来做到的,以下是源代码:
// Global leaving operator new
inline TAny* operator new(TUint aSize, TLeave)
{return User::AllocL(aSize);}
可以看到,这个new是会Leave的,而TLeave是一个枚举里面只有一个值ELeave,这也就是为什么在Symbian里要用new (ELeave)。看看AllocL()的注释吧:
Allocates a cell of specified size from the current thread‘s heap, and leaves if there is insufficient memory in the heap.
也就是说如果没有办法分配内存,程序就会异常退出,而如果采用传统的构造方法,在构造一个对象的时候异常将会导致内存泄漏。而Symbian采用二阶段构造,在构造函数里不分配堆内存,而是在new操作完成之后再去分配。这样即使new操作符Leave了,也不会产生内存泄漏。
参考资料:
http://www.cnblogs.com/jason-jiang/archive/2006/11/03/549114.html
http://www.leftworld.net/online/effectivec/file/ch02c.htm
http://www.zahui.com/html/1/37789.htm