Ответ в теме: Идиома RAII. Объекты управления ресурсами в C++

      Комментарии к записи Ответ в теме: Идиома RAII. Объекты управления ресурсами в C++ отключены
#2857

Огромное количество таких классов уже реализовано в стандартной библиотеке, подавляющее их число связано с оперативной памятью.

Надо понимать, что RAII-класс не занимается непосредственным освобождением ресурса, он лишь вызывает для этого какую-то функцию (операционной системы, например).

Если мы работаем с файлом, то именно операционная система выполняет большую часть работы работы по управлению ресурсом – она не позволяет открыть двум процессам одновременно файл для записи и т.д. Наш RAII класс сможет лишь вызвать функцию open в конструкторе и close в деструкторе.

Если ресурсом является мьютекс – такой пример рассматривает Скотт Мэйерс:

class Lock {
public:
  explicit Lock(Mutex* mutex) : m_pmutex(mutex) {
    lock(m_pmutex);
  }
  ~Lock() {
    unlock(m_pmutex);
  }
private:
  Mutex *m_pmutex;
};

То наш класс будет лишь вызывать функции lock (в конструкторе) и unlock (в деструкторе).

Работа с сокетами (ресурсом является сетевое соединение) часто на уровне операционной системы эквивалентна работе с файлами, т.к. сокет на самом деле и представляет собой файл. Мы пишем в сокет данные, чтобы передать их на другой узел в сети, но на самом деле лишь дописывам их в конец файла, а другой процесс, занимающийся передачей – берет их из начала. Аналогично реализуется работа с именованными каналами (механизм взаимодействия процессов операционной системы) и много всего другого.

При работе с оперативной памятью RAII-классы могут вызывать функции new и delete (или malloc/free) которые возвращают область памяти менеджеру. Существует огромное количество таких классов. В качестве примера собственного RAII-класса можно рассмотреть Array.