C++ 面试题 目录

C++ 中什么是栈展开 (stack unwinding)?

推荐答案

栈展开(stack unwinding)是C++中异常处理机制的一部分。当异常被抛出时,程序会从当前函数开始,沿着调用栈向上回溯,直到找到能够处理该异常的 catch 块。在这个过程中,所有在调用栈上的局部对象会被自动销毁,这个过程就称为栈展开。

本题详细解读

栈展开的过程

  1. 异常抛出:当程序执行到 throw 语句时,异常被抛出。
  2. 查找匹配的 catch:程序从当前函数开始,沿着调用栈向上查找,直到找到一个能够处理该异常类型的 catch 块。
  3. 局部对象的析构:在查找 catch 块的过程中,程序会依次退出每个函数,并在退出时调用这些函数中局部对象的析构函数,确保资源被正确释放。
  4. 异常处理:一旦找到匹配的 catch 块,程序会执行该块中的代码来处理异常。

栈展开的示例

-- -------------------- ---- -------
-------- ----------
-------- -----------

----- -------- -
-------
    ---------- - --------- -- --------- ------------ -
    ----------- - --------- -- --------- ------------ -
--

---- ------ -
    -------- ----
    ----- ---------------------- ----- -----------
-

--- ------ -
    --- -
        -------
    - ----- ------ --------------- -- -
        --------- -- ---------- ------- - -- -------- -- -----
    -
    ------ --
-

在这个示例中,当 func() 函数中抛出异常时,程序会开始栈展开过程。func() 函数中的局部对象 res 会被销毁,输出 "Resource released"。然后,异常会被 main() 函数中的 catch 块捕获并处理。

栈展开的注意事项

  • 资源管理:栈展开确保了局部对象的析构函数被调用,因此可以用于资源管理,如释放内存、关闭文件等。
  • 异常安全:栈展开是C++异常安全机制的重要组成部分,确保在异常发生时程序状态的一致性。
  • 性能影响:栈展开可能会带来一定的性能开销,特别是在异常频繁抛出的情况下。

通过栈展开,C++ 提供了一种强大的机制来处理异常,并确保资源在异常发生时能够被正确释放。

纠错
反馈