C语言数组与numpy数组,从分配的数组在C中创建numpy数组会导致内存泄漏

我已经在程序中跟踪到我用C语言编写的Python模块的内存泄漏,以有效地解析以ASCII十六进制表示的数组。(例如“ FF 39 00 FC ...”)

char* buf;

unsigned short bytesPerTable;

if (!PyArg_ParseTuple(args, "sH", &buf, &bytesPerTable))

{

return NULL;

}

unsigned short rowSize = bytesPerTable;

char* CArray = malloc(rowSize * sizeof(char));

// Populate CArray with data parsed from buf

ascii_buf_to_table(buf, bytesPerTable, rowSize, CArray);

int dims[1] = {rowSize};

PyObject* pythonArray = PyArray_SimpleNewFromData(1, (npy_intp*)dims, NPY_INT8, (void*)CArray);

return Py_BuildValue("(O)", pythonArray);

我意识到numpy不知道释放为CArray分配的内存,从而导致内存泄漏。在对该问题进行了一些研究之后,在本文的注释建议下,我添加了以下行,该行应告诉数组它“拥有”它的数据,并在删除它时释放它。

PyArray_ENABLEFLAGS((PyArrayObject*)pythonArray, NPY_ARRAY_OWNDATA);

但是我仍然遇到内存泄漏。我究竟做错了什么?如何使NPY_ARRAY_OWNDATA标志正常工作?

作为参考,ndarraytypes.h中的文档使它看起来应该可以工作:

/*

* If set, the array owns the data: it will be free'd when the array

* is deleted.

*

* This flag may be tested for in PyArray_FLAGS(arr).

*/

#define NPY_ARRAY_OWNDATA 0x0004

同样作为参考,以下代码(调用C中定义的Python函数)演示了内存泄漏。

tableData = "FF 39 00 FC FD 37 FF FF F9 38 FE FF F1 39 FE FC \n" \

"EF 38 FF FE 47 40 00 FB 3D 3B 00 FE 41 3D 00 FE \n" \

"43 3E 00 FF 42 3C FE 02 3C 40 FD 02 31 40 FE FF \n" \

"2E 3E FF FE 24 3D FF FE 15 3E 00 FC 0D 3C 01 FA \n" \

"02 3E 01 FE 01 3E 00 FF F7 3F FF FB F4 3F FF FB \n" \

"F1 3D FE 00 F4 3D FE 00 F9 3E FE FC FE 3E FD FE \n" \

"F6 3E FE 02 03 3E 00 FE 04 3E 00 FC 0B 3D 00 FD \n" \

"09 3A 00 01 03 3D 00 FD FB 3B FE FB FD 3E FD FF \n"

for i in xrange(1000000):

PES = ParseTable(tableData, 128, 4) //Causes memory usage to skyrocket

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值