Daily bit(e) C++. Работа с устаревшими ресурсами с использованием std::unique_ptr

Добавлено 17 августа 2026 в 07:24

Daily bit(e) C++ 85, обертывание устаревших ресурсов с помощью std::unique_ptr.

Daily bit(e) C++

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

std::unique_ptr может служить здесь вспомогательным инструментом, поскольку он принимает пользовательские функции удаления (делитеры). К сожалению, интерфейс не очень эргономичен, что мы можем исправить, введя короткий вспомогательный метод.

#include <memory>
#include <cstdio>

template <typename P, typename D>
auto wrap_unique(P* pointer, D&& deleter) 
{
    return std::unique_ptr<P, D>{
        pointer,
        std::forward<D>(deleter)
    };
}

int main() 
{
    auto file = wrap_unique(
        fopen("/dev/null", "r"),
        [](std::FILE* fp) noexcept {
            fclose(fp);
        });
    // файл будет автоматически закрыт, когда
    // выйдет из области видимости
}

Пример на Compiler Explorer

Теги

C++ / CppDaily bit(e) C++std::unique_ptrПрограммирование