Рассмотрим этот простой класс, демонстрирующий RAII на C ++ (из моей головы):
class X {
public:
X() {
fp = fopen("whatever", "r");
if (fp == NULL)
throw some_exception();
}
~X() {
if (fclose(fp) != 0){
// An error. Now what?
}
}
private:
FILE *fp;
X(X const&) = delete;
X(X&&) = delete;
X& operator=(X const&) = delete;
X& operator=(X&&) = delete;
}
Я не могу создать исключение в деструкторе. У меня ошибка, но нет возможности сообщить о ней. И этот пример довольно общий: я могу делать это не только с файлами, но и, например, с потоками posix, графическими ресурсами ... Я отмечаю, например, как страница Wikipedia RAII скрывает всю проблему под ковриком: http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization
Мне кажется, что RAII полезен только в том случае, если уничтожение гарантированно произойдет без ошибок. Единственные известные мне ресурсы с этим свойством - это память. Теперь мне кажется, что, например, Бем довольно убедительно развенчивает идею ручного управления памятью, которое является хорошей идеей в любой распространенной ситуации, так где же вообще преимущество в способе использования RAII в C ++?
Да, я знаю, что GC немного еретик в мире C ++ ;-)
finally
-разделе, например, в Java? - person Niklas B.   schedule 03.01.2012