在RAII's Wikipedia page确实声明:
在RAII中,持有资源是类不变的,并且与对象生存期相关联:资源分配(获取)在对象创建(特别是初始化)期间由构造函数完成,而资源释放(释放)在对象期间完成破坏者(特别是最终确定),由析构函数。
在D language
示例中,我们可以轻松了解Class Invariant
的含义:
class Date {
int day;
int hour;
invariant() {
assert(1 <= day && day <= 31);
assert(0 <= hour && hour < 24);
}
}
这是一个约束,指的是在有效状态下可以考虑的类字段。然而,持有资源意味着什么呢?这是否意味着资源是我的资源,并且是构造函数构建的资源,直到de destrutor对其进行破坏?
答案 0 :(得分:2)
这是否意味着资源是我的,并且将由构造函数从构造中获取,直到de destrutor对其进行破坏
在正确的设计程序中,情况就是如此,但所有权的概念并未在C ++中强制执行。
很容易“射击自己的脚”并将资源提供给其他物体。例如,当资源是指针时,您可能会意外地在对象之间共享它,如下所示:
struct A
{
int some_variable;
};
struct A_holder
{
A* ptr;
A_holder()
{
ptr = new A();
}
~A_holder()
{
delete ptr;
}
};
int main()
{
{
A_holder a_holder;
auto another_A_holder = a_holder;
}
//error because delete is called twice:
//first on A_holder's pointer and a second time on another_A_holder's pointer
return 0;
}
有关零的规则,请参阅https://rmf.io/cxx11/rule-of-zero