下面顯示的一些代碼類型導致我在通過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++代碼)。儘管如此,這是一個聰明的測試。 –