防止资源泄露(内存泄露)

More Effective C++ 学习笔记

Posted by Echo on April 24, 2020

C++ 是一个难学易用的语言!难学一方面在于其广博,因此我选择用笔记的形式精简出一些有用的条款。

防止资源泄露

在发生异常时,好的构造和析构函数能够防止资源泄露。

析构函数

  1. try...catch 块,若遇到异常,先释放资源再传递异常,可行但难以维护且不美观
  2. 局部对象替代指针避免内存泄露,比如灵巧指针类 auto_ptr
~auto_ptr() {delete ptr;}   // 在析构函数里显式释放资源

构造函数

由于 C++ 仅仅能删除被完全构造的对象,即只有一个对象的构造函数完全运行完毕,这个对象才被完全地构造,因此,若在构造函数内部发生异常,则异常点之前成功分配的内存就会发生泄漏。

注意,构造函数后冒号为初始化列表,用于 const 和引用的初始化。该列表仅为表达式而非语句,且总是在构造函数第一条语句执行前执行。

  1. 构造函数内用 try...catch 块,若遇到异常,先释放资源再传递异常
  2. 若指针为 const,则 1 不可行,需要另行构造带 try...catch 的初始化函数来初始化指针,可行但难以维护且使得构造函数过于分散
  3. 选择使用 auto_ptr 将指针封装为一个局部对象,既可防止构造函数内的资源泄露,又可简化析构函数