我定义了一个python-c-api类,它的真实数据结构如下:
typedef struct _C_CMISS_h
{
PyObject_HEAD // == PyObject ob_base;
TestClass _in_Handle;
}C_CMISS_h;这是销毁函数,每次python类被销毁时,这个函数都会被处理。
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,则不会处理此销毁方法。因为销毁方法不应该被调用两次或更多次,所以我想知道是否需要人工调用它。
发布于 2017-07-11 15:12:40
是的,需要人工调用销毁函数。
在本例中,如果我们将Testclass的销毁方法定义为:
.cpp
TestClass::~TestClass(){
cout << "CALL THE DESTRUCTION!!!!" << endl;
}那么我们就不会在名为cclass的PyClass的销毁函数中调用它。之后,像这样编写一个.py:
.py
import Xdll
if __name__=='__main__':
X = Xdll.cclass()
print(X)
X = 11
print(X)您会发现无法收到来自TestClass销毁方法的消息。实际上,如果您不手动定义此方法,C类将保留在内存中并占用内存空间。与此方法相比:
typedef struct _C_CMISS_h{
PyObject_HEAD
TestClass _in_Handle;
}C_CMISS_h;建议使用此方法定义数据区域:
typedef struct _C_CMISS_h{
PyObject_HEAD
TestClass *_in_Handle;
}C_CMISS_h;然后你可以使用new和delete来人为地控制你的内存空间。
https://stackoverflow.com/questions/45017303
复制相似问题