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

标签 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;
}

即在这里返回一个数组。这个数组在 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/

相关文章:

python - Scikit-learn:训练/测试拆分不可重现

python - 从 pandas resample 对象中删除空的 DataFrame

C++ C2100 初始化结构变量时的非法间接访问

c++ - Box2d cpp 给出 : box2d expression area > 1. 1 异常

c++ - 为什么语句不能出现在命名空间范围内?

jquery - Django:即使键存在,将 AJAX POST 数据传递给 Django 也会产生 MultiValueDictKeyError

javascript - 如果数组值已经存在,则删除 JavaScript

javascript - jQuery.InArray() 返回 -1 的问题

javascript - 从数组中过滤多个对象

python - 如何修复: compairing result of a bigquery query to a list