gpt4 book ai didi

python - 销毁 PyCapsule 对象

转载 作者:太空狗 更新时间:2023-10-30 01:32:42 25 4
gpt4 key购买 nike

根据 documentationPyCapsule_New() 的第三个参数可以指定一个析构函数,我认为应该在胶囊被销毁时调用它。

void mapDestroy(PyObject *capsule) {

lash_map_simple_t *map;
fprintf(stderr, "Entered destructor\n");
map = (lash_map_simple_t*)PyCapsule_GetPointer(capsule, "MAP_C_API");
if (map == NULL)
return;
fprintf(stderr, "Destroying map %p\n", map);
lashMapSimpleFree(map);
free(map);

}

static PyObject * mapSimpleInit_func(PyObject *self, PyObject *args) {

unsigned int w;
unsigned int h;
PyObject *pymap;

lash_map_simple_t *map = (lash_map_simple_t*)malloc(sizeof(lash_map_simple_t));

pymap = PyCapsule_New((void *)map, "MAP_C_API", mapDestroy);

if (!PyArg_ParseTuple(args, "II", &w, &h))
return NULL;

lashMapSimpleInit(map, &w, &h);

return Py_BuildValue("O", pymap);

}

但是,当我实例化对象并将其删除或从 Python 控制台退出时,似乎没有调用析构函数:

>>> a = mapSimpleInit(10,20)
>>> a
<capsule object "MAP_C_API" at 0x7fcf4959f930>
>>> del(a)
>>> a = mapSimpleInit(10,20)
>>> a
<capsule object "MAP_C_API" at 0x7fcf495186f0>
>>> quit()
lash@CANTANDO ~/programming/src/liblashgame $

我的猜测是它与 Py_BuildValue() 返回对“胶囊”的新引用有关,删除后不会影响原始引用。无论如何,我将如何确保对象被正确销毁?

使用 Python 3.4.3 [GCC 4.8.4](在 Linux 上)

最佳答案

上面的代码有引用泄漏:pymap = PyCapsule_New() 返回一个新对象(其引用计数为 1),但是 Py_BuildValue("O", pymap)创建对同一对象的新引用,其引用计数现在为 2。

只需return pymap;

关于python - 销毁 PyCapsule 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39305286/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com