Почему RAII так назван?
Смысл, который я получаю об этой идиоме, состоит в том, что она полезна, потому что она гарантирует, что ресурсы высвобождаются после того, как объект, который их использует, выходит из области видимости.
Другими словами, это больше о де-захвате и деинициализации, так почему эта идиома названа так, как она есть?
1 ответ
Во-первых, я должен отметить, что это широко считается плохо названной идиомой. Многие люди предпочитают SBRM, что означает управление ресурсами, связанными со стеком. Хотя я (неохотно) согласен с использованием "RAII" просто потому, что он широко известен и используется, я думаю, что SBRM дает гораздо лучшее описание реального намерения.
Во-вторых, когда RAII был новым, он применил к приобретению столько же, сколько и освобождение ресурсов. В частности, в то время было довольно распространенным видеть инициализацию в два этапа. Сначала вы определите объект, и только потом динамически распределяете любые ресурсы, связанные с этим объектом. Многие руководства по стилю поддерживали это, в основном потому, что в то время (до того, как в C++ была обработка исключений) не было хорошего способа справиться с ошибкой в конструкторе. Поэтому, как часто говорят в руководствах по стилю, конструкторы должны выполнять лишь минимальный объем работы и, в частности, избегать всего, что было открыто для отказа, особенно при распределении ресурсов (и некоторые все еще говорят подобные вещи).
Однако некоторые из них уже выполнили освобождение ресурсов в деструкторе, так что это не было бы столь явным отличием от предыдущей практики.