在RAII中持有资源是一类invariante意味着什么?

时间:2017-02-21 03:29:23

标签: c++ raii invariants

持有资源的意思是RAII中的类invariante?

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对其进行破坏?

1 个答案:

答案 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