以下に示すタイプのコードによって、Cython を介して呼び出された C++ コードでメモリ破損が発生しました。なんとか解決できましたが、解決するために最低限必要なものは何ですか?
仮定する:
CFoo
set_ptr
一部のメンバーが double へのポインターを取るC++ クラスです。Cython クラスFoo
は へのポインタを保持しますCFoo
。bar
のいくつかのメソッド内でFoo
:- 一時的な
numpy.array
、a
は、 を呼び出すことによって作成されfunction_returning_a_numpy_array()
ます。 - 表示用に型指定されたメモリ
a_view
ビューが作成されa
ます。 - からのポインターがusingのメンバー
a_view
に送信されます。CFoo
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
で reclaimed のメモリを見つけることができることは明らかですa
。a
のメンバーにすることでこれを解決しましたFoo
。私の質問は次のとおりです。
double *
これは(に設定&a_view[0]
) を のメンバーにすることで解決されFoo
ますか? いいえと思います。double a_view[:]
これは(に設定a
) を のメンバーにすることで解決されFoo
ますか? これに何らかの方法で対処しているドキュメントには何も見つかりません。