На Страница Википедии RAII это заявляет:
В RAII удержание ресурса является инвариантом класса и связано с временем жизни объекта: выделение (получение) ресурса выполняется во время создания объекта (в частности, инициализации) конструктором, а освобождение (освобождение) ресурса — во время уничтожения объекта (в частности, завершение), деструктором.
На D language
Например, мы можем легко понять, что делает Class Invariant
средства:
class Date {
int day;
int hour;
invariant() {
assert(1 <= day && day <= 31);
assert(0 <= hour && hour < 24);
}
}
Это ограничение, относящееся к тому, что может удерживать поле класса для рассмотрения в допустимом состоянии. Однако, что это значит с удержанием ресурса? Означает ли это, что ресурс мой и будет моим от его конструктора до его уничтожения де-деструктором?
Означает ли это, что ресурс мой и будет моим от его конструктора до его уничтожения де-деструктором?
В правильно разработанной программе это так, но концепция владения не поддерживается в 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 для правила нуля
Других решений пока нет …