我正在处理一个项目的问题,我不确定最好的方法 解决它。
基本上我正在将一个缓慢的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 ++库中有其他函数来调用这个函数。鉴于我刚刚编写了函数并且即将编写其他函数,我知道在这些函数中使用后删除[]返回的指针。但是,我对目前的情况不满意,好像我以外的人(或者几个月内我自己)使用这个功能,未来内存泄漏的可能性相对较高。
谢谢!
答案 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