🔴 异常路上,手动版漏了,RAII 版没漏
(本条路线统一用 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;
}
全部评论