C++的异常探讨

本文探讨了Symbian系统及标准C++中如何避免内存泄漏,重点介绍了构造函数与析构函数的作用,以及通过智能指针等手段确保内存正确释放的方法。

前提:对象拥有权不转移

 

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

 

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值