C++的异常探讨

来源:互联网 发布:bayer转rgb算法 编辑:程序博客网 时间:2024/06/18 01:32

前提:对象拥有权不转移

 

重要标准:构造函数(完整的一个构造,如果是两阶段构造的话,要包括第二阶段)与析构函数必须让内存归零。

 

Symbian的二阶段构造,通过清理栈来防止ML

1.  外围对象用NewL/NewLC产生的

2.  外围对象是栈中的对象,注意嵌套的所有必须提供类似于close/release/delete的方法,防止ML(基类要Delete,包含对象要Delete,注意:Delete必须像析构函数一样,从派生类递归完成到最后的基类) // error information !!!

3.  R类通常析构并不会close它自己,所以R类栈对象也要close push一下

4.  资源受限设备不适合把大对象放在栈上

 

标准C++的异常,满足三点就没有ML

1.  New表达式(C++中的New表达式实际上是两个阶段,首先是执行New函数分配内存,其次执行构造函数)抛出异常,抛出点不会造成内存泄露,编译器程序员保证

2.  栈对象因为会自动调用析构,编译器保证没有内存泄露

3.  堆对象产生销毁,程序员保证没有内存泄露

 

a.       分配内存时抛出异常,自然没有内存泄露

b.       所有构造函数内部抛出异常必须不能产生内存泄露,这需要编译器,生成主动调用基类的析构和包含对象的析构以及栈对象的析构的代码。所以程序员只要负责好堆对象即可

 

构造函数抛出异常时不需要也不会调用它对应的析构函数的,所以常使用智能指针

 

可以通过递归的方法证明没有ML

先证明简单类不存在ML,再证明复合类(多继承,包含)也不存在ML

原创粉丝点击