首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有必要在python-c-api销毁函数中销毁一个c-class?

是否有必要在python-c-api销毁函数中销毁一个c-class?
EN

Stack Overflow用户
提问于 2017-07-11 00:30:52
回答 1查看 29关注 0票数 0

我定义了一个python-c-api类,它的真实数据结构如下:

代码语言:javascript
复制
typedef struct _C_CMISS_h
{
    PyObject_HEAD             // == PyObject ob_base;
    TestClass _in_Handle;
}C_CMISS_h;

这是销毁函数,每次python类被销毁时,这个函数都会被处理。

代码语言:javascript
复制
static void C_CMISS_Destruct(C_CMISS_h* Self){ //reload the destuction method
    /*Self->_in_Handle.~TestClass(); //destruct the C class*/
    Py_TYPE(Self)->tp_free((PyObject*)Self); //destruct this instance
} 

有必要让这个函数来销毁C类吗?也许在析构python对象时,Self会在内存中被删除,因此_in_Handle会自动调用C的析构方法。但是,如果不删除_in_Handle,则不会处理此销毁方法。因为销毁方法不应该被调用两次或更多次,所以我想知道是否需要人工调用它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-11 15:12:40

是的,需要人工调用销毁函数。

在本例中,如果我们将Testclass的销毁方法定义为:

.cpp

代码语言:javascript
复制
TestClass::~TestClass(){
    cout << "CALL THE DESTRUCTION!!!!" << endl;
}

那么我们就不会在名为cclass的PyClass的销毁函数中调用它。之后,像这样编写一个.py:

.py

代码语言:javascript
复制
import Xdll
if __name__=='__main__':
    X = Xdll.cclass()
    print(X)
    X = 11
    print(X)

您会发现无法收到来自TestClass销毁方法的消息。实际上,如果您不手动定义此方法,C类将保留在内存中并占用内存空间。与此方法相比:

代码语言:javascript
复制
typedef struct _C_CMISS_h{
    PyObject_HEAD
    TestClass _in_Handle;
}C_CMISS_h;

建议使用此方法定义数据区域:

代码语言:javascript
复制
typedef struct _C_CMISS_h{
    PyObject_HEAD
    TestClass *_in_Handle;
}C_CMISS_h;

然后你可以使用newdelete来人为地控制你的内存空间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45017303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档