下面显示的某些类型的代码导致我在通过 Cython 调用的 C++ 代码中出现内存损坏。我已经设法解决它,但想问什么是最低限度要求是多少。
认为:
CFoo
是一个 C++ 类,其中一些成员set_ptr
采用指向双精度的指针。Cython 类Foo
拥有一个指向CFoo
.- 在某种
bar
方法内Foo
:- 通过调用创建瞬态
numpy.array
, 。a
function_returning_a_numpy_array()
- 创建一个类型化的内存视图
a_view
以供查看a
。 - 一个指针 from
a_view
被发送到CFoo
usingCFoo
的成员set_ptr
。
- 通过调用创建瞬态
片段:
cdef class Foo:
cdef CFoo *foo_imp;
...
def bar(self):
a = function_returning_a_numpy_array()
cdef double a_view[:] = a
foo_imp.set_ptr(&a_view[0])
请注意,在这个问题的上下文中,后续调用Foo
将导致CFoo
对该指针进行操作。
很明显,由于没有保存任何内容a
,后续调用Foo
's 成员可以找到a
reclaimed 的内存。我已经通过创建a
一个成员解决了这个问题Foo
。我的问题是:
这会通过使
double *
(设置为&a_view[0]
)成为 的成员来解决Foo
吗?我猜没有。这会通过使
double a_view[:]
(设置为a
)成为 的成员来解决Foo
吗?我在文档中找不到任何解决此问题的方法。