私はBoost Pythonを使用しています。私はC++で整数の大きなベクトルを生成しています。このベクトルをコピーせずにPythonでアクセスしたいと思います。 CではC++からPythonにポインタを渡す/ w boost python?
++私が持っている:
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の原因となります。私の間違いのアイデアは何ですか?
編集:
次のコードは、PythonにC++からベクトル内のデータを取得するために動作しますが、メモリリークが発生します。ベクターはコピーされていますか? 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++ポインタ" の例を試してみました: https://wiki.python.org/moin/boost.python/PointersAndSmartPointers
それはあまりにもクラッシュします。
編集3 ...私はいくつかの理由のためのPythonに渡されたものへのポインタを取得することができないようです。
クラッシュこの機能では、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)));
}
初期のコードは、私のために動作します。 Boost.Pythonと 'myModule'がPythonの同じバージョンに対してビルドされ、同じBoost.Pythonビルド設定を使用していることを確認する価値があります。さらに、 'myModule'がビルド元のBoost.Pythonバージョンとリンクしていることを確認してください。 –
私はすべてが一貫したPythonライブラリを使用していると思います。私はDependency Walkerでチェックしましたが、何かを見逃したかもしれません。私は64ビットのPython 2.7.5を使用していて、WindowsのMingw-w64でコンパイルしています。私は、python27.dllからlibpython27.aを生成するためにgendefとdlltoolを使用しなければなりませんでした。これと何か関係がありますか? –