Различные 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;
}