C++;Python对象中的对象包装器未销毁 我注意到,当Python对象被释放时,在Python对象中包裹的C++对象没有被破坏。

C++;Python对象中的对象包装器未销毁 我注意到,当Python对象被释放时,在Python对象中包裹的C++对象没有被破坏。,python,c++,cpython,Python,C++,Cpython,下面是我使用CPython C API的类型定义: typedef struct { PyObject_HEAD CppFoo fooObj; std::vector<Py_ssize_t> size; } FooObject; 在Python中调用以下代码时,调试器会命中FooObject_dealloc: >>>myfoo=Foo() >>>del myfoo 但是,即使在tp_init中调用了构造函数,也没有调用C

下面是我使用CPython C API的类型定义:

typedef struct {
    PyObject_HEAD
    CppFoo fooObj;
    std::vector<Py_ssize_t> size;
} FooObject;
在Python中调用以下代码时,调试器会命中FooObject_dealloc:

>>>myfoo=Foo()
>>>del myfoo
但是,即使在tp_init中调用了构造函数,也没有调用CppFoo的析构函数。这怎么会发生?当myfoo被释放时,CppFoo的析构函数不应该自动调用吗?应采取什么措施避免fooObj泄漏

编辑: 在创建类型时,我基本上遵循了教程:


<> P>不同的是,在C++中,在C++对象中添加了C++对象,而不是int或PyObjy*,C++中,使用动态内存构造对象包括两个步骤:

  • 为对象分配内存
  • 使用有效的构造函数初始化对象
  • 另一方面,使用动态内存销毁对象还包括两个步骤:

  • 调用析构函数来析构函数对象
  • 取消分配对象的内存
  • 从你的帖子中不清楚你是如何构造这个物体的,但是破坏的问题是很清楚的。您有步骤2的代码,但没有步骤1的代码

    我不想提出一个具体的方法来正确处理对象的破坏,直到我看到您构建对象的代码

    >>>myfoo=Foo()
    >>>del myfoo