通过ctypes为返回到python的对象释放内存

通过ctypes为返回到python的对象释放内存,第1张

概述我正在使用ctypes将MyDll中的c函数扩展为python.from ctypes import cdll libX = cdll.LoadLibrary('d:\\MyTestProject\\debug\\MyDll.dll') 进一步在.py文件中我有一个类,其方法通过ctypes调用MyDll中的函数.Class MyTestClass:

我正在使用ctypes将MyDll中的c函数扩展为python.

from ctypes import cdlllibX = cdll.Loadlibrary("d:\MyTestProject\deBUG\MyDll.dll")

进一步在.py文件中我有一个类,其方法通过ctypes调用MyDll中的函数.

Class MyTestClass:       def __init__(self,ID):           libA.MyTestClassInDLL_new.restype = ctypes.c_voID_p           self.obj = libA.MyTestClassInDLL_new(ID)

相应的c函数MyTestClassInDLL_new已在MyDll中定义为 –

extern "C" __declspec(dllexport) voID * MyTestClassInDLL_new(char* ID) {      pTestObject = new CMyTestClassInDLL(CString(ID));      return (voID *)pTestObject;    }

注意我使用new来在我的vc dll中实例化这个对象并返回指向它的指针.我在.py文件中将此函数的restype设置为ctypes.c_voID_p.

我执行的脚本包含以下内容 –

testob = MyTestClass("5")

这很好用.我在这里获得的testob进一步用于调用其内部从MyDll调用c函数的方法.

但是,该对象是使用MyDll中的new创建的,并通过MyTestClassInDLL_new()函数返回.这个物体是如何被摧毁的?在某个地方我需要使用delete pTestObject,以便调用它的析构函数来执行清理并释放内存.

最佳答案我通常通过添加一个extern destroy对象函数来处理这个问题,我可以将指针传回并删除它.

CPP:

SomeClass* createObj(){    return new SomeClass();}voID destroyObj(SomeClass* pObj){  delete pObj;  pObj = NulL;}

H:

extern "C" {  SomeClass* createObj();  voID destroyObj(SomeClass*);}

潘岳:

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)
总结

以上是内存溢出为你收集整理的通过ctypes为返回到python的对象释放内存全部内容,希望文章能够帮你解决通过ctypes为返回到python的对象释放内存所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1205794.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存