让对象负责资源
文件句柄、动态内存和套接字等资源,都需要在适当时机释放。RAII把这种责任放进一个管理对象:初始化取得并建立有效状态,析构处理所管理资源,调用者通过这个对象使用资源。
管理对象可以是局部变量,也可以嵌入其他对象。以C++智能指针为例,实际数据仍可分配在堆上;RAII约束的是拥有关系与清理时机,并不要求把全部资源本体都放到调用栈。
正常退出与异常退出共享清理
在C++的正常作用域退出与异常栈展开过程中,适用的自动对象会按语言规则析构。把释放放入资源句柄,能让多个提前返回或抛出路径使用同一套清理逻辑,而不必每处再复制释放代码。
构造尚未完成就抛出时,还须区分完整对象与已经构造完成的子对象。C++规定清理这些已完成的子对象;因此让成员各自拥有资源,比在外层构造函数中零散保存未管理的地址更容易组织失败处理。
自动释放不是任意操作的回滚
释放资源不会自动撤销已经写入外部系统的内容,也不能单独证明操作满足强异常保证。若多个状态必须一起更新,还需要明确提交、回滚及失败报告的契约,析构中的清理也不应再制造无法处理的异常。
自动析构依赖实际退出方式。Rust的丢弃规则也明确区分正常清理、显式抑制析构和不展开栈的进程终止。因此采用生命期管理,并不能承诺所有崩溃、强制结束或外部故障下仍执行全部清理。