【问题标题】:C++ objects wrapper in Python object not destroyedPython 对象中的 C++ 对象包装器未销毁
【发布时间】: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* 之外的类型。

【问题讨论】:

    标签: python c++ cpython


    【解决方案1】:

    在 C++ 中,使用动态内存构造对象包括两个步骤:

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

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

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

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

    在我看到您构建对象的代码之前,我不想提出正确处理对象破坏的具体方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 2023-02-08
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多