从python中的共享库返回的数组 - 这是内存泄漏吗?

时间:2014-12-10 18:50:39

标签: python c++ arrays ctypes

我正在处理一个项目的问题,我不确定最好的方法 解决它。

基本上我正在将一个缓慢的python算法推送到一个c ++共享库中,我用它来做很多数字密集的东西。其中一个c ++函数的形式如下:

const int* some_function(inputs){

//does some stuff
int *return_array = new int[10];

// fills return array with a few values

return return_array;
}

I.e返回一个数组。这个数组使用numpy ndpointer在python中解释:

lib.some_function.restype = ndpointer(dtype=c_int, shape=(10,))

我有几个问题,我一直在烦恼一段时间:

1)我在这里动态分配了内存。鉴于我通过共享库调用此函数并进入python,我是否会导致内存泄漏?我的程序运行时很长,我可能会将此函数调用数百万次,所以这很重要。

2)我可以使用更好的数据结构吗?如果这是一个纯c ++函数,我会返回一个向量,但是从谷歌搜索,这似乎是一个非常理想的解决方案在python与ctypes。我还在c ++库中有其他函数来调用这个函数。鉴于我刚刚编写了函数并且即将编写其他函数,我知道在这些函数中使用后删除[]返回的指针。但是,我对目前的情况不满意,好像我以外的人(或者几个月内我自己)使用这个功能,未来内存泄漏的可能性相对较高。

谢谢!

2 个答案:

答案 0 :(得分:1)

是的,你正在泄漏记忆。 Python代码不可能自动释放指向的内存(因为它不知道它是如何分配的)。您需要提供相应的解除分配函数(调用delete[])并告诉Python如何调用它(可能使用@RichardHidges建议的包装器框架)。

答案 1 :(得分:0)

您可能想要考虑使用SWIG或boost :: python

这里有一个使用boost :: python将std :: vector转换为python列表的示例: std::vector to boost::python::list

这是swig的链接: http://www.swig.org