2017-03-05 46 views
0

我正在开发一个应用程序的后端,我尝试用python包装我的C++代码。我使用Boost Python3将C++链接到python。我能够获得一个共享库,并从Python中调用它。目前,一切正常。在c + + python包装内存泄漏

当我试图导出此库时出现问题。我希望能够在不重新编译C++代码的情况下从其他位置或计算机使用它。

要试试这个图书馆,我只是移动图书馆在其depedencies另一个文件夹,并用ldd检查所有的depedencies都解决了(对于没有问题)。

然后,我试图从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

我终于找到了段错误。 我用于编译程序的标题与库使用的标题不同。一个班级成员没有申报,因此没有给该成员分配记忆。