前提:对象拥有权不转移
重要标准:构造函数(完整的一个构造,如果是两阶段构造的话,要包括第二阶段)与析构函数必须让内存归零。
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
本文探讨了Symbian系统及标准C++中如何避免内存泄漏,重点介绍了构造函数与析构函数的作用,以及通过智能指针等手段确保内存正确释放的方法。
1117

被折叠的 条评论
为什么被折叠?



