【问题标题】:deallocating memory for objects returned to python through ctypes为通过 ctypes 返回给 python 的对象释放内存
【发布时间】:2011-11-15 22:45:40
【问题描述】:

我正在使用 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 以便调用它的析构函数来进行清理并释放内存。

【问题讨论】:

    标签: python ctypes


    【解决方案1】:

    我通常通过添加一个外部销毁对象函数来处理这个问题,我可以将指针传回并删除它。

    CPP:

    SomeClass* createObj()
    {
        return new SomeClass();
    }
    
    void destroyObj(SomeClass* pObj){
      delete pObj;
      pObj = NULL;
    }
    

    H:

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

    PY:

    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)
    

    【讨论】:

    • 我也做了同样的事情。问题是 del 在脚本执行结束时没有被调用。我可以通过什么方式确保在 testob 超出范围后调用 del(即脚本结束?)在脚本调用结束时设置 testob = None del乙>。但这可能不是正确的方法。
    • 如果脚本退出,内存将被清理。如果它困扰您,请显式调用 del 函数:del testob。
    猜你喜欢
    • 2016-07-20
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 2016-11-27
    • 2010-11-18
    相关资源
    最近更新 更多