您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

5b51 2022/1/14 8:21:19 python 字数 3982 阅读 478 来源 www.jb51.cc/python

我正在使用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 cdll
libX = 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,以便调用它的析构函数来执行清理并释放内存.

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的对象释放内存所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶