Рассмотрим этот простой класс, демонстрирующий RAII в С++ (сверху):
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 полезен только тогда, когда уничтожение гарантировано произойдет без ошибок. Единственными ресурсами, известными мне с этим свойством, являются память. Теперь мне кажется, что, например, Boehm довольно убедительно разоблачает идею ручного управления памятью, является хорошей идеей в любой общей ситуации, так где же преимущество в использовании С++ для использования RAII?
Да, я знаю, что GC немного еретичен в мире С++; -)