2016-06-01 12 views
4

私は現在、boost::python::call関数を持つPythonコールバック関数へのC++ポインタを渡しています。これは正常に動作しますが、C++コードでポインタを削除しないと、メモリリークが発生します。boost :: pythonはオブジェクトの所有権をpythonコールバック関数に渡すことができますか?

私はコールバックにポインタを渡し、Pythonのガベージコレクタにオブジェクトの有効期間を処理させたいと思います。今、コールバックに渡されたオブジェクトを保存したい場合は、詳細コピーを行う必要があります。

私はこの種のものはreturn_value_policy<manage_new_object>で包まれたC++関数の戻り値を持つことが可能であることがhereを見てきました。 boost::python::callの引数と同様のことをすることは可能ですか?

答えて

4

道はmanage_new_objectです。引数を呼び出し側が責任を負わなければならない変換結果に変換するメタ機能クラスになります。通常のコールポリシーでは、フードの下で使用されます。私達はちょうど明示的に自分自身をそのメタ関数クラスを使用する必要があります。

struct Foo { 
    X* x = ...; 

    void give_up_x(py::object callback) { 
     py::manage_new_object::apply<X*>::type wrapper; 
     callback(py::handle<>{wrapper(x)}); 
    } 
}; 

ラッパーではなくpy::objectPyObject*をあなたに戻っていますので、あなたがpy::handle<>を必要としています。あなたはより直接的になりたい場合は、中間型インスタンスの一部を省略して、単に使用することができます。

void give_up_x(py::object callback) { 
    callback(py::handle<>{py::detail::make_owning_holder::execute(x)}); 
} 

私は推測-とチェックを通じて上記に出くわしました。それは少なくともそれが動作するように見えますか?

関連する問題