繁体   English   中英

Python object 中的 C++ 对象包装器未销毁

[英]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 构造对象涉及两个步骤:

  1. 为对象分配 memory。
  2. 使用有效的构造函数初始化对象。

另一方面,使用动态 memory 销毁对象也涉及两个步骤:

  1. 调用析构函数来销毁对象。
  2. 为对象释放 memory。

从您的帖子中不清楚您是如何构建 object 的,但破坏的问题很明显。 您有第 2 步的代码,但没有第 1 步的代码。

在我看到您构建 object 的代码之前,我不想建议一种具体的方法来正确处理 object 的破坏。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM