[英]C++ objects wrapper in Python object not destroyed
I noticed that C++ objects wrapped in Python object were not destroyed when the Python object was released.
这是我使用 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* 之外的类型。
在 C++ 中,使用动态 memory 构造对象涉及两个步骤:
另一方面,使用动态 memory 销毁对象也涉及两个步骤:
从您的帖子中不清楚您是如何构建 object 的,但破坏的问题很明显。 您有第 2 步的代码,但没有第 1 步的代码。
在我看到您构建 object 的代码之前,我不想建议一种具体的方法来正确处理 object 的破坏。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.