Шаблоны проектирования управления ресурсами - PullRequest
0 голосов
/ 26 октября 2018

Различные API требуют вызова методов инициализации и финализации. Совсем недавно я сталкивался с этим при использовании Python C ++ API, где все вызовы API должны быть между вызовами Py_Initialize и Py_FinalizeEx. Мое текущее решение - поместить такие вызовы в начало и конец основного метода. Это не кажется идеальным, поскольку оно отделяет фактическое использование API от управления ресурсами. То есть программные компоненты, которые выполняют вызовы API, используют основной метод для получения и уничтожения ресурсов.

Есть ли шаблон, который обычно применяется в таком сценарии?

Вот что я сейчас делаю.

int redirected(int argc, char *argv[]) {
    // Actual main method

    return 0;
}

int main(int argc, char *argv[]) {
    auto program = Py_DecodeLocale(argv[0], NULL);
    if (program)
        Py_SetProgramName(program);
    else
        throw new std::runtime_error("Py_SetProgramName");

    Py_Initialize();

    int errc = redirected(argc, argv);

    if (Py_FinalizeEx() < 0)
        throw new std::runtime_error("Py_FinalizeEx");

    PyMem_RawFree(program);

    return errc;
}

1 Ответ

0 голосов
/ 26 октября 2018

Правильный шаблон в C ++ использует RAII.И действительно, это очень хороший вопрос.

Это означает, что конструктор объекта получит ресурс, а деструктор его освободит.Таким образом вы гарантируете, что ресурс всегда будет освобожден при выходе из области видимости.

Для Python это будет:

class PyInit
{
public:
    PyInit() {Py_Initialize();}
    ~PyInit() {Py_Finalize();}
}

А затем в main:

int main()
{
    PyInit pyinit;
    // using Python interpreter
    return 0;
}
...