Что означает сохранение ресурса в классе инвариантов в инварианте класса?

Что означает, что хранение ресурса является инвариантом класса в RAII?

На Страница Википедии RAII это заявляет:

В RAII удержание ресурса является инвариантом класса и связано с временем жизни объекта: выделение (получение) ресурса выполняется во время создания объекта (в частности, инициализации) конструктором, а освобождение (освобождение) ресурса — во время уничтожения объекта (в частности, завершение), деструктором.

На D language Например, мы можем легко понять, что делает Class Invariant средства:

class Date {
int day;
int hour;

invariant() {
assert(1 <= day && day <= 31);
assert(0 <= hour && hour < 24);
}
}

Это ограничение, относящееся к тому, что может удерживать поле класса для рассмотрения в допустимом состоянии. Однако, что это значит с удержанием ресурса? Означает ли это, что ресурс мой и будет моим от его конструктора до его уничтожения де-деструктором?

2

Решение

Означает ли это, что ресурс мой и будет моим от его конструктора до его уничтожения де-деструктором?

В правильно разработанной программе это так, но концепция владения не поддерживается в 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 для правила нуля

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]