资源管理设计模式

Resource Management Design Patterns

本文关键字:设计模式 资源管理      更新时间:2023-10-16

各种API都需要调用初始化和终结方法。最近,我在使用Python C++API时遇到了这一点,其中所有API调用都必须介于对Py_InitializePy_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;
}

C++中正确的模式是使用RAII。事实上,这是一个非常好的问题。

这意味着对象的构造函数将获取资源,析构函数将释放它。这样可以确保在超出范围时总是释放资源。

对于Python,它将是:

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

然后主要是:

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