🔴 异常路上,手动版漏了,RAII 版没漏

👁️ 1 人浏览 💬 0 人评论 ❤️ 添加收藏

(本条路线统一用 g++ -std=c++17 -O0 -Wall 编译)同一件事两种写法,都从异常那条路出去:

#include <iostream>
#include <memory>
#include <stdexcept>

struct Res {
    static int made, gone;
    Res()  { made++; }
    ~Res() { gone++; }
};
int Res::made = 0;
int Res::gone = 0;

/* 手动版:抛出去的那条路,delete 根本执行不到 */
static void manual(int boom) {
    Res *p = new Res();
    if (boom) throw std::runtime_error("boom");
    delete p;
}

/* RAII 版:抛出去也照样析构 —— 栈展开是标准行为 */
static void raii(int boom) {
    auto p = std::make_unique<Res>();
    if (boom) throw std::runtime_error("boom");
}

int main() {
    try { manual(1); } catch (const std::exception &) {}
    int owed_manual = Res::made - Res::gone;

    int base = Res::made - Res::gone;
    try { raii(1); } catch (const std::exception &) {}
    int owed_raii = (Res::made - Res::gone) - base;

    std::cout << owed_manual << "/" << owed_raii << "\n";
    return 0;
}
提交你的答案
请登录后提交答案。
去登录
代码编辑器
Ctrl + Enter 运行
本次输入:
输出:

                        
👩‍🏫
AI
💬 题目评论

全部评论