zoukankan      html  css  js  c++  java
  • More Effective C++ 条款9 利用 destructor 避免泄露资源

    1. “函数抛出异常的时候,将暂停当前函数的执行,开始查找匹配的catch语句。首先检查throw本身是否在try块内部,如果是,检查与该try块相关的catch语句,看是否其中之一与被抛出的对象相匹配。如果找到匹配的catch,就处理异常;如果找不到,就退出当前函数(释放当前函数的内存并撤销局部对象),并继续在调用函数中查找。”(《C++ Primier》)这称为栈展开。

    2. 函数执行的过程中一旦抛出异常,就停止接下来语句的执行,跳出try块(try块之内throw之后的语句不再执行)并开始寻找匹配的catch语句,跳出try块的过程中,会适当的撤销已经被创建的局部对象,运行局部对象的析构函数并释放内存。

    3. 如果在throw之前恰好在堆中申请了内存,而释放内存的语句又恰好在throw语句之后的话,那么一旦抛出异常,该语句将不会执行造成内存泄露问题。

    4. 解决办法是将指针类型封装在一个类中,并在该类的析构函数中释放内存。这样即使抛出异常,该类的析构函数也会运行,内存也可以被适当的释放。C++ 标准库提供了一个名为auto_ptr的类模板,用来完成这种功能。

  • 相关阅读:
    洛谷P1120-小木棍
    flask之注册功能
    python数据库操作-mysql数据库
    flask之数据库的交互
    flask之显示当地时间
    flask之url_for函数
    flask之Twitter Bootstrap
    flask之模板之继承
    flask之表单
    flask之jinjia2模板
  • 原文地址:https://www.cnblogs.com/reasno/p/4602186.html
Copyright © 2011-2022 走看看