我对我正在从事的项目有疑问,并且不确定解决问题的最佳方法 解决它。
基本上,我将一个慢速的 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;
}
即在这里返回一个数组。这个数组在 python 中使用 numpy ndpointer 解释:
lib.some_function.restype = ndpointer(dtype=c_int, shape=(10,))
我有几个问题困扰了我一段时间:
1) 我在这里动态分配了内存。鉴于我通过共享库调用此函数并进入 python,是否会导致内存泄漏?我的程序运行时间很长,我可能会调用这个函数数百万次,所以这很重要。
2) 我可以使用更好的数据结构吗?如果这是一个纯 c++ 函数,我会返回一个 vector ,但是通过谷歌搜索,这似乎是 python 中带有 ctypes 的一个不理想的解决方案。我在 c++ 库中还有其他调用此函数的函数。鉴于我刚刚编写了函数并且即将编写其他函数,我知道在这些函数中使用后删除 [] 返回的指针。但是,我对目前的情况并不满意,好像除了我以外的人(或者几个月后确实是我自己)使用这个功能,以后内存泄漏的可能性比较大。
谢谢!
最佳答案
是的,你正在泄漏内存。 Python 代码不可能自动释放指向的内存(因为它不知道它是如何分配的)。您需要提供相应的取消分配函数(调用 delete[]
)并告诉 Python 如何调用它(可能使用 @RichardHidges 推荐的包装器框架)。
关于python - 从 python 中的共享库返回的数组 - 这是内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27408627/