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