0%

C++ 内存管理

C++ 内存管理

一句话定位:C++ 没有 GC,靠 RAII(资源获取即初始化)把内存/文件/锁等资源的生命周期绑定到对象的构造/析构上,编译器保证析构一定被调用,从而在没有垃圾回收的前提下做到”自动释放”。

1. RAII:核心思想

  • 资源在构造函数里获取,在析构函数里释放;只要对象离开作用域(正常返回、异常抛出、提前 return),析构函数都会被调用
  • 好处:把”何时释放”这个容易遗漏的问题,转成”对象生命周期管理”这个编译器能强制保证的问题,天然异常安全。

2. 智能指针:RAII 在动态内存上的应用

  • unique_ptr:独占所有权,不可拷贝只能移动(move);开销几乎等于裸指针,是默认首选。
  • shared_ptr:引用计数式共享所有权,计数归零时自动释放;代价是原子计数的线程安全开销,且存在循环引用会导致内存永远无法释放的陷阱。
  • weak_ptr:不增加引用计数的”观察者”引用,专门用来打破 shared_ptr 之间的循环引用(如父子节点互相持有对方的场景)。

3. 面试落点

  • 能讲清”为什么 C++ 不需要 GC 也能自动管理内存”——本质是编译器保证的析构调用时机确定,而 GC 语言的回收时机不确定。
  • 能识别循环引用场景(如双向链表、观察者模式)并知道用 weak_ptr 破除。
  • 可迁移话术:这套”生命周期绑定资源释放”的思路和 Java 的 try-with-resources、Python 的 with 语句是同一类模式,只是 C++ 把它做成了语言默认行为。

参考:《Effective Modern C++》(Scott Meyers)