Можно ли считать ленивую загрузку примером RAII?


Я догоняю свой c++ в последнее время, после пары лет эксклюзивного Objective-C на iOS, и тема, которая больше всего подходит для "нового стиля" c++, - RAII

Чтобы убедиться, что я правильно понимаю концепцию RAII, вы считаете Objective-C lazy loading property accessors типом RAII? Например, проверьте следующий метод доступа

- (NSArray *)items {
    if(_items==nil) {
        _items=[[NSArray alloc] initWithCapacity:10];
    }
    return _items
}

Можно ли считать это примером RAII? Если нет, то не могли бы вы объяснить, где я ошибаюсь?

4 3

4 ответа:

RAII , к сожалению, широко используется не по назначению.

Первоначальная концепцияприобретение ресурсов-это инициализация была связана с использованием конструкторов, чтобы гарантировать, что это произойдет. В этой идее:

std::fstream out("somefile.txt", "w");

Должен гарантировать, что если out когда-либо будет создан, то файл существует и готов к использованию.

Следовательно, ленивая загрузка является противоположностью RAII !

Примечание: В настоящее время, однако, RAII в основном используется для обозначения автоматического очистка . Примером могут служить умные указатели. Это немного далеко от своей первоначальной цели.


Что касается очистки, другой идиомой является SBRM дляУправления связанными ресурсами . Однако он не полностью отражает идею детерминированной очистки. Идея SBRM заключается в том, что вы гарантируете, что ресурс будет очищен, когда определенный объект выходит из области видимости. Это может быть достигнуто, например, с помощью boost::scoped_ptr.

Однако это не может захватить то, что делает unique_ptr, так как вы можете фактически return A unique_ptr таким образом, позволяя ресурсу выйти за пределы области, в которой он был создан!

В то время как аббревиатура именует инициализацию, фокус идиомы-разрушение. получение ресурсов-это инициализация больше оуправлении ресурсами с ограниченной областью , то есть когда объект управляет ресурсом и очищает его, когда он выходит за пределы области.

Нет, вовсе нет. Кроме того, под "новым стилем C++" вы подразумеваете "все здравомыслящие делали это исключительно в течение последних пятнадцати лет, по крайней мере".

RAII включает в себя объекты автоматической длительности хранения, очищающие динамические объекты в их деструкторе, которым они владеют. Точное время владения не имеет значения.

Нет; RAII-это когда некоторый объект, имеющий динамическое хранилище, оборачивается в объект(ы) с автоматическим хранением и уничтожается, когда объект(ы) с автоматическим хранением уничтожается.

Ленивая загрузка (загрузка объекта только тогда и тогда, когда вам это действительно нужно, а не раньше) и RAII на самом деле не связаны.