How to free/delete an instance that is loaded by the pluginlib::ClassLoader?

asked 2018-08-14 10:04:43 -0500

nyaruko gravatar image

Say I have created an instance through:

plugin = m_plugin_loader.createUnmanagedInstance(pl_name);

then I delete it immediately as:

delete plugin;

But the valgrind is giving me memory leakage error:

==15668== 315 (160 direct, 155 indirect) bytes in 1 blocks are definitely lost in loss record 61 of 67
==15668==    at 0x4C2E0EF: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==15668==    by 0x10698666: void class_loader::class_loader_private::registerPlugin<consoleplugin::DummyPlugin, consoleplugin::ConsoleMsgPlugin>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (class_loader_core.hpp:195)
==15668==    by 0x10696E5D: (anonymous namespace)::ProxyExec0::ProxyExec0() (dummyplugin.cpp:50)
==15668==    by 0x10696FF7: __static_initialization_and_destruction_0(int, int) (dummyplugin.cpp:50)
==15668==    by 0x1069700D: _GLOBAL__sub_I_dummyplugin.cpp (dummyplugin.cpp:50)
==15668==    by 0x40106B9: call_init.part.0 (dl-init.c:72)
==15668==    by 0x40107CA: call_init (dl-init.c:30)
==15668==    by 0x40107CA: _dl_init (dl-init.c:120)
==15668==    by 0x40158E1: dl_open_worker (dl-open.c:575)
==15668==    by 0x4010563: _dl_catch_error (dl-error.c:187)
==15668==    by 0x4014DA8: _dl_open (dl-open.c:660)
==15668==    by 0x92AAF08: dlopen_doit (dlopen.c:66)
==15668==    by 0x4010563: _dl_catch_error (dl-error.c:187)
==15668==    by 0x92AB570: _dlerror_run (dlerror.c:163)
==15668==    by 0x92AAFA0: dlopen@@GLIBC_2.2.5 (dlopen.c:87)
==15668==    by 0x7C54861: Poco::SharedLibraryImpl::loadImpl(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (in /usr/lib/libPocoFoundation.so.9)
==15668==    by 0x7C54D7F: Poco::SharedLibrary::SharedLibrary(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (in /usr/lib/libPocoFoundation.so.9) 
==15668==    by 0x56015DA: class_loader::class_loader_private::loadLibrary(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, class_loader::ClassLoader*) (in /opt/ros/kinetic/lib/libclass_loader.so)
==15668==    by 0x55FBAA9: class_loader::ClassLoader::loadLibrary() (in /opt/ros/kinetic/lib/libclass_loader.so)
==15668==    by 0x55FBCB7: class_loader::ClassLoader::ClassLoader(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool) (in /opt/ros/kinetic/lib/libclass_loader.so)
==15668==    by 0x56053B1: class_loader::MultiLibraryClassLoader::loadLibrary(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (in /opt/ros/kinetic/lib/libclass_loader.so)
==15668==    by 0x4827A3: pluginlib::ClassLoader<consoleplugin::ConsoleMsgPlugin>::loadLibraryForClass(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (class_loader_imp.hpp:630)
==15668==    by 0x47DB8F: pluginlib::ClassLoader<consoleplugin::ConsoleMsgPlugin>::createUnmanagedInstance(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (class_loader_imp.hpp:229)
==15668==    by 0x474E50: ConsoleMgr::add_plugin(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&) (ConsoleMgr.cpp:139)
==15668==    by 0x473FCB: ConsoleMgr::ConsoleMgr(ros::NodeHandle&) (ConsoleMgr.cpp:16)
==15668==    by 0x46A3AF: main (main.cpp:7)

I am on Ubuntu 16.04 kinetic, is there anyway to avoid this? Or is this a bug for the ros plugin library?

edit retag flag offensive close merge delete