【二】 Symbian对象构造
C++的纯手工内存管理,确实是一个万恶之源。在对象构造时,有一个著名的内存泄漏隐患问题。比如一个类如下:
class A
{
public:
A()
{
a1 = new T1();
a2 = new T2();
...
an = new Tn();
}
private:
T1 * a1;
T2 * a2;
...
Tn * an;
}
当你调用 new A() 进行分配的时候,一旦失败,可能导致内存的泄露。比如系统正吭哧吭哧分配到了a18,失败了,抛出异常了,或者返回空值了,前面a1 - a17个对象,就彻底成了没娘管的娃,一并泄漏了出去。一个解决策略是,管好每一个分配过的对象,一旦有问题,清空一切。比如 a18分配失败了,delete掉a1 - a17。且不说这么做有没有其他问题,但是这份苦力,估计就没多少人能够承受。
二阶段构造
为了解决对象分配的问题,Symbian琢磨了所谓的二阶段构造法,它是一个pattern,关键在于将对象中栈数据的初始化和堆对象的分配过程隔离开来。一个标准的二阶段构造类如下: !--判断阅读权限-->!--判断是否已经扣点--> |