SWIG を使用して、Python で C++ クラスと C++ 関数をラップしました。
class Module { ... };
void register_module(Module *m);
関数 register_module() は、指定されたモジュールをグローバル リストに配置して、それ以降、C++ コードがモジュールのポインターを保持し、それを使用できるようにします。
ここで、組み込みの Python インタープリターから実行される次の Python コードがクラッシュします。
>>> register_module(Module())
一方、次の python コードはクラッシュしません。
>>> m = Module()
>>> register_module(m)
明らかに、その理由は、最初のケースではオブジェクトが python によってガベージ コレクションされるのに対し、2 番目のケースではそうではないためです。
最初のケースで作成され、C++ コードで使用される匿名オブジェクトを Python が削除しないようにする最善の方法は何ですか?
register_module() 関数で、関連する python プロキシ オブジェクトを保持し、その参照カウントを増やす方法はありますか?
(問題のクラスが Swig::Director クラスにクロスキャストできる場合、これが可能であることはわかっていますが、これは Python で定義された Module サブクラスのインスタンスがあることを前提としていますが、ここでは当てはまりません) .