使用时资源获取即初始化 (RIAA) http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization在 C++ 中,通常有以下内容:
class CriticalSection {
public:
void enter();
void leave();
};
class SectionLocker {
public:
SectionLocker(CriticalSection& cs)
: mCs(cs) {
cs.enter();
}
~SectionLocker() {
cs.leave();
}
private:
CriticalSection& mCs;
};
CriticalSection gOperationLock; // Global lock for some shared resource
void doThings(int a, int b) {
SectionLocker locker(gOperationLock);
int c = doOtherThings(a);
doMoreThings(b);
doOneMoreThing(a, b, c);
}
我知道在某些垃圾收集语言(例如 CLR)中,这样做不安全的众多原因之一是 doThings() 返回之前 doThings() 内的 Locker 对象将有资格进行垃圾收集,因为 Locker 永远不会创建后引用。
仅在调用 doOneMoreThing() 之后调用 Locker 析构函数的预期行为是否是 C++ 中定义良好的行为?
如果是这样,是否可以保证何时调用析构函数(并且释放 gOperationLock)?或者只是在超出范围后的某个时刻?
C++ 标准 (n3290) 对此非常清楚。您的 RAII 对象始终会具有自动存储持续时间(如果没有,您就做错了!)
§12.4.11 说:
“对于构造对象,隐式调用析构函数......
自动存储持续时间(3.7.3)当对象所在的块
创建退出 (6.7)"
§6.7.2 说:
块中声明的具有自动存储期限的变量是
退出区块时被销毁 (6.6)
§6.6.2 规定:
在退出作用域时(无论如何完成),具有自动功能的对象
在该范围内构建的存储持续时间(3.7.3)是
以与建造相反的顺序被摧毁。
毫无疑问,实现这一点的唯一一致方法是可观察的行为是自动存储对象在块末尾被破坏。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)