RAII для параметра-дескриптора

146
01 декабря 2020, 21:10

В этой теме уже рассматривалась техника оборачивания WinAPI функций в unique_ptr, однако у меня возник вопрос как это должно реализовываться в функциях, возвратом которых является статус операции, а открываемый дескриптор указывается одним из параметров? К примеру, возьмем RegOpenKeyEx, как к данной функции применить аналогичный подход?

Answer 1
  1. Сначала отдельно вызвать RegOpenKeyEx, получить результат, а уже потом "передать его на сохранение" в unique_ptr. Получится не совсем RAII, но если между получением дескриптора и передачей его в unique_ptr не выбрасывается исключений, то цель RAII не нарушается

    HKEY hkey{};
    RegOpenKeyEx(..., &hkey);
    std::unique_ptr<HKEY, HKEYCloser> unique_hkey(hkey);
    

    Это при желании можно записать и через оператор "запятая"

    HKEY hkey{};
    std::unique_ptr<HKEY, HKEYCloser> unique_hkey((RegOpenKeyEx(..., &hkey), hkey));
    
  2. Написать свою-функцию обертку для RegOpenKeyEx, которая будет именно возвращать результат через возвращаемое значение. (Те же замечания.)

  3. Еще как-то...

Применение std::unique_ptr с системными хэндлам действительно сводится скорее к роли RAII-guard, а не к полноценному smart pointer. Т.е. задача RAII-guard состоит лишь в том, чтобы предотвратить утечку ресурса, а не в том, чтобы целиком подменить собой сам хэндл. Работать c хэндлом именно через std::unique_ptr будет действительно неудобно, как правильно заметил @VTT в комментариях. Для локальной работы лучше просто вычитывать из него хэндл и работать с хэндлом напрямую.

READ ALSO
std::vector из std::mutex. Как реализовать

std::vector из std::mutex. Как реализовать

Нужно сделать вектор со структурой, содержащей вектор из структур, содержащих мьютекс

122
с++ не работает условие

с++ не работает условие

цикл while срабатывает и при значениях j больше размера массива

130
Одновременно не выводятся оба QLineSeries

Одновременно не выводятся оба QLineSeries

В данном фрагменте кода я пытаюсь вывести некий график с двумя SeriesДля более быстрого вывода я удаляю, заполняю Series и затем добавляю их обратно

101
Очистить буфер ввода

Очистить буфер ввода

Пытаюсь написать кроссплатформенную функцию, аналог system("pause");

119