首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当PyCapsule_New失败时指针所有权

当PyCapsule_New失败时指针所有权
EN

Stack Overflow用户
提问于 2017-03-15 19:09:13
回答 1查看 992关注 0票数 1

PyCapsule_New接受一个析构函数,当胶囊被销毁时调用这个函数:

代码语言:javascript
运行
复制
PyObject* PyCapsule_New(void *pointer, const char *name, PyCapsule_Destructor destructor)

我试图使用这种机制将由C++代码创建的对象的所有权传递给Python。具体来说,析构函数只是调用对象的"delete“。

代码语言:javascript
运行
复制
auto ptr = make_unique<ObjType>(arg);
PyObject * ret = PyCapsule_New(ptr.release(), nullptr, Destroyer);

void Destroyer(PyObject *capsule)
{
    auto rawPtr = static_cast<ObjType*>(PyCapsule_GetPointer(capsule, nullptr));
    delete rawPtr;
}

在我看来,这里似乎存在一个潜在的内存泄漏:如果PyCapsule_New失败,释放的原始指针就会变得悬空。我试图从Python文档中获得确认。但是,它只提到在失败时设置一个异常,并返回一个NULL。它没有提到所有权。

假定指针将处于悬空状态似乎是合理的,因为如果胶囊最初没有生成,就没有处理程序传递给析构函数。

但是,我不确定PyCapsule_New内部是否调用析构函数,特别是:

  • 在PyCapsule_New内部,胶囊结构几乎完成。
  • 一个失败发生在它回来之前。
  • PyCapsule_New设置一个异常,调用析构函数(?)后返回NULL,

如果突出显示的部分永远不会发生,在我看来,上面的代码必须重写为

代码语言:javascript
运行
复制
auto ptr = make_unique<ObjType>(arg);
PyObject * ret = PyCapsule_New(ptr.get(), nullptr, Destroyer);
if (ret != nullptr)
    ptr.release();

有人能帮我确认一下是否是这样吗?

EN

回答 1

Stack Overflow用户

发布于 2017-03-20 14:36:31

如建议的那样,改变评论以回答。

简短的回答:不,当PyCapsule_New失败时,它不会调用驱逐舰。

参见https://github.com/python/cpython/blob/master/Objects/capsule.c#L44中的实现

代码语言:javascript
运行
复制
PyObject *
PyCapsule_New(void *pointer, const char *name, PyCapsule_Destructor destructor)
{
    PyCapsule *capsule;

    if (!pointer) {
        PyErr_SetString(PyExc_ValueError, "PyCapsule_New called with null pointer");
        return NULL;
    }

    capsule = PyObject_NEW(PyCapsule, &PyCapsule_Type);
    if (capsule == NULL) {
        return NULL;
    }

    capsule->pointer = pointer;
    capsule->name = name;
    capsule->context = NULL;
    capsule->destructor = destructor;

    return (PyObject *)capsule;
}

因此,第一个实现确实包含潜在的内存泄漏。只有在PyCapsule_New成功时才应该调用"release()“。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42818669

复制
相关文章

相似问题

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