【发布时间】:2017-07-25 03:50:56
【问题描述】:
我正在开发应用程序的后端,并尝试将我的 c++ 代码包装在 python 中。我使用 Boost Python3 将 c++ 链接到 python。我能够获得一个共享库并从 python 调用它。目前,一切正常。
当我尝试导出此库时出现问题。我希望能够在其他位置或计算机上使用它,而无需重新编译 c++ 代码。
要试用这个库,我只是将库移到另一个文件夹中,并检查其依赖关系是否已解决(没问题)。
然后,我试图从 python3 调用一些对象。一开始,我可以运行很多功能,但如果我退出并重新启动 python3,我开始出现一些分段错误、内存损坏……例如: * Error in `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"
我正在努力解决这个问题。任何想法或提示都将受到欢迎。
谢谢
【问题讨论】:
-
您必须提供一个小的独立样本 - MCVE。
-
我无法用一个小例子重现错误......有什么建议吗?
-
使用调试器。查看内存损坏发生的位置。不要满足于你甚至不理解的解决方法。
-
我已经用
-D_GLIBCXX_DEBUG编译了我的程序,并且发现了一个基于迭代器的向量副本的错误。我想我已经解决了部分问题,但最后我仍然有一个段错误。我目前正在检查我是否没有删除两次对象 -
我不再认为问题出在 python 包装器上,而是来自我的共享库。据我了解,共享库管理的是内存中自己的堆栈,所以当我一次编译时,我只有一个堆栈,但现在我使用共享库,我至少有两个堆栈(一个用于可执行文件,一个用于共享库)
标签: python c++ boost memory-leaks shared-libraries