c ++ python包装器中的内存泄漏

时间:2017-03-05 08:00:06

标签: python c++ boost memory-leaks shared-libraries

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

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

要尝试使用此库,我只是将库移动到具有依赖关系的另一个文件夹中,并检查ldd是否已解决所有依赖关系(没问题)。

然后,我试图从python3调用一些对象。一开始,我能够运行很多功能,但是如果我退出并重新启动python3,我就会开始出现一些分段错误,内存损坏......作为一个例子: *`python3&#中的错误39;: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"

我正在努力解决这个问题。任何想法或提示都将受到欢迎。

谢谢

1 个答案:

答案 0 :(得分:0)

我终于找到了段错误。 我用来编译程序的标题与库使用的标题不同。未声明一个类成员,因此没有为该成员分配内存。