下面显示的一些代码类型导致我在通过Cython调用的C++代码中损坏内存。我已经设法解决它,但想问什么是解决它所需的最小。键入的MemoryView是否增加numpy.array的引用计数?
假设:
CFoo
是一个C++类的一些部件set_ptr
采用指针的两倍。 Cython类Foo
包含指向CFoo
的指针。- 内
Foo
一些bar
方法:- 瞬态
numpy.array
,a
,通过调用function_returning_a_numpy_array()
创建。 - 有类型的内存视图,
a_view
创建用于查看a
。使用CFoo
的成员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
的成员可以找到a
回收的内存。我已经通过使a
成为Foo
的成员来解决此问题。我的问题是:
这会通过制造
double *
(设置为&a_view[0]
)的Foo
成员来解决?我猜测没有。这是通过使
double a_view[:]
(设置为a
)Foo
的成员解决?我无法在文档中找到任何解决这种或那种方法的内容。
这是一个很好的答案 - 谢谢。我有点担心,推断它是像refcount这样的东西是确定性的,因为它是一个可能会改变的实现(因为这个原因,我没有看到Cython生成的C++代码)。尽管如此,这是一个聪明的测试。 –