我有一个返回std::vector的C++函数,我想在Python中使用它,所以我正在使用C numpy API:
发生的情况是:第一次打印正常,值是正确的。但是当我绘制
static PyObject *
py_integrate(PyObject *self, PyObject *args){
...
std::vector<double> integral;
cpp_function(integral); // This changes integral
npy_intp size = {integral.size()};
PyObject *out = PyArray_SimpleNewFromData(1, &size, NPY_DOUBLE, &(integral[0]));
return out;
}
以下是我在Python中的调用方法:
import matplotlib.pyplot as plt
a = py_integrate(parameters)
print a
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(a)
print a
发生的情况是:第一次打印正常,值是正确的。但是当我绘制
a
时,它们不正确;在第二次打印中,我看到非常奇怪的值,例如 1E-308 1E-308 ...
或 0 0 0 ...
,这是未初始化的内存。我不明白为什么第一次打印正常。
部分解决方案(不起作用):
static void DeleteVector(void *ptr)
{
std::cout << "Delete" << std::endl;
vector * v = static_cast<std::vector<double> * >(ptr);
delete v;
return;
}
static PyObject *
cppfunction(PyObject *self, PyObject *args)
{
std::vector<double> *vector = new std::vector<double>();
vector->push_back(1.);
PyObject *py_integral = PyCObject_FromVoidPtr(vector, DeleteVector);
npy_intp size = {vector->size()};
PyArrayObject *out;
((PyArrayObject*) out)->base = py_integral;
return (PyObject*)(out);
}
std::vector
有一个析构函数,但是 Python CObject 没有,它负责删除向量。您只需要提供一个删除其中包含的向量的小函数。 - kwatforddoubble
拼写错误看出来),所以你可能不小心漏掉了某些东西。你可以复制并粘贴所有内容,包括修改后的内容,以获得更准确的重现。 - kwatford