深入理解RAII与类型擦除技术
1. RAII技术概述
RAII(Resource Acquisition Is Initialization)是C++中广泛使用的资源管理惯用法。在这种模式下,每个资源都由一个对象拥有,对象的构造(或初始化)过程会获取资源,而对象的销毁过程则会释放资源。
当解锁互斥量失败时, std::lock_guard 的析构函数需要处理这个错误。实际上,解锁互斥量不会抛出异常,但如果失败会导致未定义行为。这并非偶然,互斥量设计为与RAII对象一起工作。一般来说,C++在释放资源时,如果释放失败不应抛出异常,或者至少不允许异常传播。可以捕获并记录异常,但调用程序通常不会意识到失败,可能会付出未定义行为的代价。
RAII是一种非常成功的技术,从C++11之前到C++20,即使语言发生了显著变化,它也几乎没有什么改变(除了一些小的语法便利,如构造函数参数推导)。这是因为它几乎没有明显的缺点。
2. 传统RAII的局限性
当资源获取或释放代码很长且复杂时,RAII会存在一些问题。资源的获取和释放分别在RAII对象的构造函数和析构函数中完成,这些代码可能与资源获取的位置相距较远,我们需要在程序中来回跳转才能理解其功能。
例如,我们想要一个RAII锁保护对象,在锁定和解锁互斥量时执行多个操作,并且其资源处理方式依赖于一些外部参数:
// Example 09a
class lock_guard {
std::mutex& m_;
const bool log_;
con
超级会员免费看
订阅专栏 解锁全文
39

被折叠的 条评论
为什么被折叠?



