2017-03-05 15 views
0

私はアプリのバックエンドを開発しています。私はPythonでC++コードをラップしようとしています。私はBoost Python3を使ってC++をPythonにリンクしています。私は共有ライブラリを取得し、Pythonから呼び出すことができます。今のところ、すべてが機能しています。C++ Pythonラッパーのメモリリーク

このライブラリをエクスポートしようとすると問題が発生します。私は、C++コードを再コンパイルせずに別の場所またはコンピュータから使用できるようにしたいと考えています。

このライブラリを試してみるには、そのライブラリをdepedenciesで別のフォルダに移動し、すべてのdepedenciesが解決されていればlddでチェックしてください(問題ありません)。

次に、python3からオブジェクトを呼び出そうとしています。最初は、多くの関数を実行することができますが、python3を終了して再起動すると、いくつかのセグメンテーションフォールト、メモリ破損などが発生します。例:* `python3 'のエラー:free() :無効な次のサイズ(通常):0x0000000001ebeb50 *

私はvalgrindを使用してメモリリークを検出しようとしました。私のプログラムでは、C + +のメモリリークがありません。 Pythonコードでvalgrindを試してみると、元のフォルダにあるライブラリのリークはありません。私はこの問題に苦しんだ

Invalid write of size 4 ==22695== at 0x6DCA0F9: Test::Test(std::string, std::string, std::string, int) (maintests.cpp:71) ==22695== by 0x6933E5B: boost::python::objects::value_holder<Test>::value_holder(_object*) (value_holder.hpp:137) ==22695== by 0x6934D8D: boost::python::objects::make_holder<0>::apply<boost::python::objects::value_holder<ritmo::Test>, boost::mpl::joint_view<boost::python::detail::drop1<boost::python::detail::type_list<boost::python::optional<std::string, std::string, std::string, int, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_>, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_> >, boost::python::optional<std::string, std::string, std::string, int, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_> > >::execute(_object*) (make_holder.hpp:94) ==22695== by 0x693924E: _object* boost::python::detail::invoke<int, void (*)(_object*), boost::python::arg_from_python<_object*> >(boost::python::detail::invoke_tag_<true, false>, int const&, void (*&)(_object*), boost::python::arg_from_python<_object*>&) (invoke.hpp:81) ==22695== by 0x6936942: boost::python::detail::caller_arity<1u>::impl<void (*)(_object*), boost::python::default_call_policies, boost::mpl::vector2<void, _object*> >::operator()(_object*, _object*) (caller.hpp:223) ==22695== by 0x6935D88: boost::python::objects::caller_py_function_impl<boost::python::detail::caller<void (*)(_object*), boost::python::default_call_policies, boost::mpl::vector2<void, _object*> > >::operator()(_object*, _object*) (py_function.hpp:38) ==22695== by 0x71CE139: boost::python::objects::function::call(_object*, _object*) const (in /usr/lib/x86_64-linux-gnu/libboost_python-py34.so.1.54.0) ==22695== by 0x71CE4A7: ??? (in /usr/lib/x86_64-linux-gnu/libboost_python-py34.so.1.54.0) ==22695== by 0x71D8742: boost::python::handle_exception_impl(boost::function0<void>) (in /usr/lib/x86_64-linux-gnu/libboost_python-py34.so.1.54.0) ==22695== by 0x71CCDB2: ??? (in /usr/lib/x86_64-linux-gnu/libboost_python-py34.so.1.54.0) ==22695== by 0x53493C: ??? (in /usr/bin/python3.4) ==22695== by 0x4F14F9: PyObject_Call (in /usr/bin/python3.4) ==22695== Address 0x6333fe0 is 16 bytes after a block of size 32 in arena "client"

:しかし、ライブラリを移動した後、私はいくつかのリークを持って開始します。どんなアイデアやヒントも歓迎する以上のものになるでしょう。

ありがとうございました

+2

小さな自己完結型サンプル - [MCVE](http://stackoverflow.com/help/mcve)を提供する必要があります。 – tambre

+0

小さな例でエラーを再現できません...アドバイスはありますか? – Antoine

+0

デバッガを使用します。メモリ破損が発生する場所を参照してください。あなたが理解していない回避策を解決しないでください。 – tambre

答えて

0

私は結局segfaultを見つけました。 プログラムのコンパイルに使用していたヘッダーは、ライブラリで使用されていたヘッダーと異なります。 1つのクラスメンバーが宣言されていないため、このメンバーに割り当てられたメモリはありません。