我正在使用ctypes将MyDll中的c函数扩展为python.
from ctypes import cdll libX = cdll.LoadLibrary("d:\\MyTestProject\\debug\\MyDll.dll")
@H_404_8@进一步在.py文件中我有一个类,其方法通过ctypes调用MyDll中的函数.
Class MyTestClass: def __init__(self,id): libA.MyTestClassInDLL_new.restype = ctypes.c_void_p self.obj = libA.MyTestClassInDLL_new(id)
@H_404_8@相应的c函数MyTestClassInDLL_new已在MyDll中定义为 –
extern "C" __declspec(dllexport) void * MyTestClassInDLL_new(char* id) { pTestObject = new CMyTestClassInDLL(CString(id)); return (void *)pTestObject; }
@H_404_8@注意我使用new来在我的vc dll中实例化这个对象并返回指向它的指针.我在.py文件中将此函数的restype设置为ctypes.c_void_p.
我执行的脚本包含以下内容 –
testob = MyTestClass("5")
@H_404_8@这很好用.我在这里获得的testob进一步用于调用其内部从MyDll调用c函数的方法.
但是,该对象是使用MyDll中的new创建的,并通过MyTestClassInDLL_new()函数返回.这个物体是如何被摧毁的?在某个地方我需要使用delete pTestObject,以便调用它的析构函数来执行清理并释放内存.
最佳答案
我通常通过添加一个extern destroy对象函数来处理这个问题,我可以将指针传回并删除它.
原文链接:https://www.f2er.com/python/439188.htmlCPP:
SomeClass* createObj() { return new SomeClass(); } void destroyObj(SomeClass* pObj){ delete pObj; pObj = NULL; }
@H_404_8@H:
extern "C" { SomeClass* createObj(); void destroyObj(SomeClass*); }
@H_404_8@潘岳:
class SomeObj: def __init__(self): self.soLib = cdll.LoadLibrary(PATH_SO) _createObj = self.soLib.createObj _createObj.restype = POINTER(c_long) self._objRef = _createObj() ## do stuff with self._objRef def __del__(self): self.soLib.destroyObj(self._objRef)
@H_404_8@