SWIG类型映射中的内存释放

Memory deallocation from SWIG typemap

本文关键字:内存 释放 类型 映射 SWIG      更新时间:2023-10-16

我正试图修复C++dll的Python包装中的内存泄漏。问题是将字节缓冲区分配给在Python:中创建的辅助对象时

struct ByteBuffer
{
    int length;
    uint8_t * dataBuf;       
};

我想将dataBuf作为Python数组提供,所以我提出的类型映射(并且有效)是:

%module(directors="1") mymodule
%typemap(in) uint8_t * (uint8_t *temp){
    int length = PySequence_Length($input);
    temp = new uint8_t[length];    // memory allocated here. How to free?
    for(int i=0; i<length; i++) {
        PyObject *o = PySequence_GetItem($input,i);
        if (PyNumber_Check(o)) {
            temp[i] = (uint8_t) PyLong_AsLong(o);
            //cout << (int)temp[i] << endl;
        } else {
            PyErr_SetString(PyExc_ValueError,"Sequence elements must be uint8_t");      
            return NULL;
        }
    }
    $1 = temp;
}

问题是类型映射每次都为一个新的C数组分配内存,而这个内存在dll中没有释放。换句话说,dll期望用户管理ByteBuffer的dataBuf的内存。例如,当在Python中顺序创建10000个这样的对象,然后删除它们时,内存使用率稳步上升(泄漏):

for i in range(10000):
    byteBuffer = mymodule.ByteBuffer()
    byteBuffer.length = 10000
    byteBuffer.dataBuf = [0]*10000
    # ... use byteBuffer
    del byteBuffer

有没有办法从python中删除分配的dataBuf?谢谢你的耐心!

编辑:我不发布整个工作代码以保持简短。如果需要,我会做的。此外,我使用的是Python 3.5 x64和SWIG 3.0.7版本

它比我想象的要简单得多。我刚刚把它添加到.I文件中

%typemap(freearg) uint8_t * {
    //cout << "Freeing uint8_t*!!! " << endl;
    if ($1) delete[]($1);
}

似乎有效。编辑:切换自由删除[]