很多从 Java / Android 转到 C++ 的工程师,一开始都会卡在一个问题上:
没有 GC,C++ 到底怎么管资源?
为什么老代码到处 new/delete,而现代 C++ 却几乎不写了?
如果你已经理解了构造函数 / 析构函数,那这篇文章,会帮你把后面最关键的一整套体系一次性打通。
一、先给系统级结论
👉RAII 是思想
👉构造 / 析构是机制
👉智能指针是“内存资源的 RAII 化”
👉不写 new/delete 是现代 C++ 的工程结论
这四点,构成了现代 C++ 的资源管理体系。
二、为什么 C++ 不靠 finally 管资源?
在 Java 里,释放资源通常是这样:
try (FileInputStream fis = new FileInputStream("a.txt")) { // use file }或者:
FileInputStream fis = null; try { fis = new FileInputStream("a.txt"); } finally { if (fis != null) fis.close(); }核心是:
👉你显式告诉语言:结束时要干什么。
2.1 C++ 的模式完全不同
void test() { File f("a.txt"); // use file } // 👈 自动 fclose你没有写 finally。
但语言保证:
👉 离开作用域,一定调用析构函数。
而析构函数里:
~File() { fclose(fp_); }于是形成模型:
进入作用域 → 构造函数(拿资源) 离开作用域 → 析构函数(放资源)这套机制,叫做:
👉RAII(Resource Acquisition Is Initialization)
👉 资源获取即初始化