【发布时间】:2021-04-20 03:44:02
【问题描述】:
我注意到在 Python 对象被释放时,包裹在 Python 对象中的 C++ 对象并没有被销毁。
这是我使用 CPython C API 的类型定义:
typedef struct {
PyObject_HEAD
CppFoo fooObj;
std::vector<Py_ssize_t> size;
} FooObject;
这是 tp_dealloc:
void FooObject_dealloc(FooObject* self) {
Py_TYPE(self)->tp_free((PyObject*)self);
}
在 Python 中调用以下代码时,调试器中会命中 FooObject_dealloc:
>>>myfoo=Foo()
>>>del myfoo
但是,即使在 tp_init 中调用了构造函数,也没有调用 CppFoo 的析构函数。这怎么可能发生?释放 myfoo 时不应该自动调用 CppFoo 的析构函数吗?应该怎么做才能避免fooObj的泄露?
编辑: 我在创建类型时几乎遵循了教程:
https://docs.python.org/3/extending/newtypes_tutorial.html
不同的是,我在 PyObject_HEAD 之后将 C++ 对象添加到了除 int 或 PyObject* 之外的类型。
【问题讨论】: