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;
}
}
$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);
}
似乎有效。编辑:切换自由删除[]
相关文章:
- 包含矢量指针的结构的内存释放问题
- Valgrind 声称内存释放中的自由空间太多
- 当 C 和 C++ 中严格要求内存释放时
- C++ 中指针变量的内存释放
- 德克内存释放
- 临时对象 c++ 的内存释放
- C 全局对象变量内存释放
- C++矢量动态内存释放/删除
- 从 cv::Mat 初始化的 IplImage 的内存释放
- SWIG类型映射中的内存释放
- STL容器中的内存释放
- QWebView内存释放
- 内存释放 C++
- 大返回值(如字符串)的内存释放如何在C++中发生
- 重新分配之前的内存释放
- Linux C++ 中的内存释放
- VS2012编译器奇怪的内存释放问题
- 调试断言失败!错误的内存释放
- 负责 COM 互操作中的内存释放
- imread命令后OpenCV矩阵内存释放