2013-09-05 9 views
6

私は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))); 
} 
+0

初期のコードは、私のために動作します。 Boost.Pythonと 'myModule'がPythonの同じバージョンに対してビルドされ、同じBoost.Pythonビルド設定を使用していることを確認する価値があります。さらに、 'myModule'がビルド元のBoost.Pythonバージョンとリンクしていることを確認してください。 –

+0

私はすべてが一貫したPythonライブラリを使用していると思います。私はDependency Walkerでチェックしましたが、何かを見逃したかもしれません。私は64ビットのPython 2.7.5を使用していて、WindowsのMingw-w64でコンパイルしています。私は、python27.dllからlibpython27.aを生成するためにgendefとdlltoolを使用しなければなりませんでした。これと何か関係がありますか? –

答えて

関連する問題