c++ - 资源管理设计模式
问题描述
各种 API 需要调用初始化和终结方法。最近我在使用 Python C++ API 时遇到了这个问题,其中所有 API 调用都必须在对Py_Initialize
和的调用之间Py_FinalizeEx
。我目前的解决方案是将此类调用放在 main 方法的开头和结尾。这似乎并不理想,因为它将 API 的实际使用与资源管理分开。也就是说,进行API调用的软件组件依赖于main方法来获取和销毁资源。
在这种情况下是否有通常应用的模式?
这是我目前正在做的事情。
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;
}
推荐阅读
- actframework - actframework 无法使用 $.merge 保存在数据库中
- excel - 从 excel 电子表格复制到 Blazor 应用程序
- xml - SSIS XML 源组件
- tensorflow - 如何在 TensorFlow Object Detection API 中使用fine_tune_checkpoint
- testing - 如何对依赖于 Web 应用程序警报通知 ID 的移动应用程序进行性能测试?
- javascript - 如何在 React 动态 JSX 中从一个 div 到另一个 div 绘制箭头?
- python - Jupyter notebook 在使用 MinMaxScalar 或 StandardScalar 时出错?
- spring - SpringBoot Logback 配置错误 - 空或空模式
- hotchocolate - hotchocolate:如何在 Errors[] 数组中引发多个错误
- c++ - 在 C++ 中按名称从页面源获取页面信息