从 SWIG 类型映射中释放内存
Memory deallocation from SWIG typemap
我正在尝试修复 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;
}
}
= 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?感谢您的耐心等待!
编辑:我没有 post 整个工作代码以使其简短。如果需要,我会做的。此外,我正在使用 Python 3.5 x64 和 SWIG ver 3.0.7
这比我想象的要简单得多。我刚刚将其添加到 .i 文件
%typemap(freearg) uint8_t * {
//cout << "Freeing uint8_t*!!! " << endl;
if () delete[]();
}
似乎有效。
编辑:使用 delete[]
免费切换
我正在尝试修复 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;
}
}
= 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?感谢您的耐心等待!
编辑:我没有 post 整个工作代码以使其简短。如果需要,我会做的。此外,我正在使用 Python 3.5 x64 和 SWIG ver 3.0.7
这比我想象的要简单得多。我刚刚将其添加到 .i 文件
%typemap(freearg) uint8_t * {
//cout << "Freeing uint8_t*!!! " << endl;
if () delete[]();
}
似乎有效。 编辑:使用 delete[]
免费切换