防止资源泄露(内存泄露)
C++ 是一个难学易用的语言!难学一方面在于其广博,因此我选择用笔记的形式精简出一些有用的条款。
# 防止资源泄露
在发生异常时,好的构造和析构函数能够防止资源泄露。
# 析构函数
- 用
try...catch
块,若遇到异常,先释放资源再传递异常,可行但难以维护且不美观 - 局部对象替代指针避免内存泄露,比如灵巧指针类
auto_ptr
~auto_ptr() {delete ptr;} // 在析构函数里显式释放资源
1
# 构造函数
由于 C++ 仅仅能删除被完全构造的对象,即只有一个对象的构造函数完全运行完毕,这个对象才被完全地构造,因此,若在构造函数内部发生异常,则异常点之前成功分配的内存就会发生泄漏。
注意,构造函数后冒号为初始化列表,用于 const
和引用的初始化。该列表仅为表达式而非语句,且总是在构造函数第一条语句执行前执行。
- 构造函数内用
try...catch
块,若遇到异常,先释放资源再传递异常 - 若指针为
const
,则 1 不可行,需要另行构造带try...catch
的初始化函数来初始化指针,可行但难以维护且使得构造函数过于分散 - 选择使用
auto_ptr
将指针封装为一个局部对象,既可防止构造函数内的资源泄露,又可简化析构函数