6

Boost Python を使用しています。C++ で大きな整数ベクトルを生成しています。このベクトルをコピーせずに Python でアクセスしたいと考えています。

C ++では、次のものがあります。

BOOST_PYTHON_MODULE(myModule)
{
    class_<vector<int>>("vectorInt").def(vector_indexing_suite<vector<int>>());
    def("ReturnVectorPtr", ReturnVectorPtr, return_value_policy<manage_new_object>());
}

vector<int>* ReturnVectorPtr()
{
    return new vector<int>();
}

それからpythonで私は持っています:

import myModule
myModule.ReturnVectorPtr()

戻り値を保存していませんが、これにより Python がクラッシュします。私の間違いは何ですか?

編集:

次のコードは、ベクター内のデータを C++ から Python に取得するために機能しますが、メモリ リークが発生します。ベクトルはコピーされ、破棄されていませんか?

C++ の場合:

BOOST_PYTHON_MODULE(myModule)
{
    class_<vector<int>>("vectorInt").def(vector_indexing_suite<vector<int>>());
    def("ModifyVectorInPlace", ModifyVectorInPlace);
}

void ModifyVectorInPlace(vector<int>& data)
{
    // Modify data...
    return;
}

それからpythonで私は持っています:

import myModule
vectorInt = myModule.vectorInt()
myModule.ModifyVectorInPlace(vectorInt)

何が起こっている?

編集2:

ここから「生の C++ ポインター」の例を試してみました

それもクラッシュします。何らかの理由で Python に渡されたものへのポインタを取得できないようです...

編集3:

このクラッシュは、次の関数の invoke.hpp からのセグメンテーション違反のようです。

template <class RC, class F BOOST_PP_ENUM_TRAILING_PARAMS_Z(1, N, class AC)>
inline PyObject* invoke(invoke_tag_<false,false>, RC const& rc, F& f BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_Z(1, N, AC, & ac) )
{
    return rc(f( BOOST_PP_ENUM_BINARY_PARAMS_Z(1, N, ac, () BOOST_PP_INTERCEPT) ));
}
4

1 に答える 1