首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >资源管理设计模式

资源管理设计模式
EN

Stack Overflow用户
提问于 2018-10-26 13:36:13
回答 1查看 319关注 0票数 2

各种API都需要调用初始化和终结方法。最近,我在使用Python时遇到了这种情况,其中所有的C++调用都必须在调用Py_InitializePy_FinalizeEx之间。我目前的解决方案是将这种调用放在主要方法的开头和结尾。这看起来并不理想,因为它将API的实际使用与它的资源管理分开。也就是说,使API调用的软件组件依赖于获取和破坏资源的主要方法。

在这种情况下,是否有通常应用的模式?

以下是我目前正在做的事情。

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-26 13:45:09

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

这意味着对象的构造函数将获取资源,析构函数将释放它。通过这种方式,您可以确保资源在超出作用域时始终被释放。

对于Python来说,它应该是:

代码语言:javascript
复制
class PyInit
{
public:
    PyInit() {Py_Initialize();}
    ~PyInit() {Py_Finalize();}
}

然后主要是:

代码语言:javascript
复制
int main()
{
    PyInit pyinit;
    // using Python interpreter
    return 0;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53009991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档