В этой теме уже рассматривалась техника оборачивания WinAPI функций в unique_ptr
, однако у меня возник вопрос как это должно реализовываться в функциях, возвратом которых является статус операции, а открываемый дескриптор указывается одним из параметров? К примеру, возьмем RegOpenKeyEx
, как к данной функции применить аналогичный подход?
Сначала отдельно вызвать 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));
Написать свою-функцию обертку для RegOpenKeyEx
, которая будет именно возвращать результат через возвращаемое значение. (Те же замечания.)
Еще как-то...
Применение std::unique_ptr
с системными хэндлам действительно сводится скорее к роли RAII-guard, а не к полноценному smart pointer. Т.е. задача RAII-guard состоит лишь в том, чтобы предотвратить утечку ресурса, а не в том, чтобы целиком подменить собой сам хэндл. Работать c хэндлом именно через std::unique_ptr
будет действительно неудобно, как правильно заметил @VTT в комментариях. Для локальной работы лучше просто вычитывать из него хэндл и работать с хэндлом напрямую.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Нужно сделать вектор со структурой, содержащей вектор из структур, содержащих мьютекс
В данном фрагменте кода я пытаюсь вывести некий график с двумя SeriesДля более быстрого вывода я удаляю, заполняю Series и затем добавляю их обратно