when I run my program, everything is going well. At the end, he prints this:
*** glibc detected *** ./streamShare: double free or corruption (fasttop): 0x08292130 *** ======= Backtrace: ========= /lib/tls/i686/cmov/libc.so.6[0xcc2ff1] /lib/tls/i686/cmov/libc.so.6[0xcc46f2] /lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0xcc779d] /usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0x1c86f1] ./streamShare[0x804be7f] ./streamShare[0x804be3e] ./streamShare[0x804abc0] ./streamShare[0x804a5f2] ./streamShare[0x804a1c4] ./streamShare[0x804a1d7] ./streamShare[0x804a46a] ./streamShare[0x804ba45] ./streamShare[0x804b49c] ./streamShare[0x804ac68] ./streamShare[0x804ac48] ./streamShare[0x804a676] ./streamShare[0x804a237] ./streamShare[0x8049a3f] ./streamShare[0x804d2e5] ./streamShare[0x804d34d] /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0xc6eb56] ./streamShare[0x8049361]
I checked this happens when the function returns, where all program objects are automatically installed. In any case, I did not define a destructor for these objects, I tried to use the STL and TR1 shared_ptr containers. I think everything happens in default destructors. Is there any way to find out where it breaks up? I mean, I would like to know what destruction of an object makes the whole mess. I use these containers and general pointers:
typedef std::tr1::shared_ptr<messageListener> mlsptr; typedef std::map<const char*, mlsptr, ltstr> CONSTCHP2MSLST;
messageListener does not have a distructor. And two of these vectors:
std::vector<MSG> queueto1;
where is the MSG destructor:
MSG::~MSG() { destroy(); } void MSG::destroy() { if (payload != NULL) delete[] payload; payload = NULL; payloadLen = 0; }
who never gave a problem before, and I never should ...
Any recommendations on how to track this issue? I dont know...
EDIT:
HERE VALGRIND OUTPUT:
valgrind ./streamShare -v ==25795== Memcheck, a memory error detector ==25795== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al. ==25795== Using Valgrind-3.5.0-Debian and LibVEX; rerun with -h for copyright info ==25795== Command: ./streamShare -v ==25795== ==25795== Invalid free() / delete / delete[] ==25795== at 0x402454D: operator delete(void*) (vg_replace_malloc.c:346) ==25795== by 0x804BCC0: std::tr1::_Sp_deleter<streamShare::messageListener>::operator()(streamShare::messageListener*) const (shared_ptr.h:97) ==25795== by 0x804BC7F: std::tr1::_Sp_counted_base_impl<streamShare::messageListener*, std::tr1::_Sp_deleter<streamShare::messageListener>, (__gnu_cxx::_Lock_policy)2>::_M_dispose() (shared_ptr.h:75) ==25795== by 0x804AAF7: std::tr1::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release() (boost_sp_counted_base.h:140) ==25795== by 0x804A58D: std::tr1::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count() (shared_ptr.h:153) ==25795== by 0x804A173: std::tr1::__shared_ptr<streamShare::messageListener, (__gnu_cxx::_Lock_policy)2>::~__shared_ptr() (shared_ptr.h:358) ==25795== by 0x804A186: std::tr1::shared_ptr<streamShare::messageListener>::~shared_ptr() (shared_ptr.h:834) ==25795== by 0x804A405: std::pair<char const* const, std::tr1::shared_ptr<streamShare::messageListener> >::~pair() (stl_pair.h:68) ==25795== by 0x804D3D0: __gnu_cxx::new_allocator<std::pair<char const* const, std::tr1::shared_ptr<streamShare::messageListener> > >::destroy(std::pair<char const* const, std::tr1::shared_ptr<streamShare::messageListener> >*) (new_allocator.h:115) ==25795== by 0x804D337: std::_Rb_tree<char const*, std::pair<char const* const, std::tr1::shared_ptr<streamShare::messageListener> >, std::_Select1st<std::pair<char const* const, std::tr1::shared_ptr<streamShare::messageListener> > >, streamShare::ltstr, std::allocator<std::pair<char const* const, std::tr1::shared_ptr<streamShare::messageListener> > > >::_M_destroy_node(std::_Rb_tree_node<std::pair<char const* const, std::tr1::shared_ptr<streamShare::messageListener> > >*) (stl_tree.h:383) ==25795== by 0x804D29B: std::_Rb_tree<char const*, std::pair<char const* const, std::tr1::shared_ptr<streamShare::messageListener> >, std::_Select1st<std::pair<char const* const, std::tr1::shared_ptr<streamShare::messageListener> > >, streamShare::ltstr, std::allocator<std::pair<char const* const, std::tr1::shared_ptr<streamShare::messageListener> > > >::_M_erase(std::_Rb_tree_node<std::pair<char const* const, std::tr1::shared_ptr<streamShare::messageListener> > >*) (stl_tree.h:972) ==25795== by 0x804D27B: std::_Rb_tree<char const*, std::pair<char const* const, std::tr1::shared_ptr<streamShare::messageListener> >, std::_Select1st<std::pair<char const* const, std::tr1::shared_ptr<streamShare::messageListener> > >, streamShare::ltstr, std::allocator<std::pair<char const* const, std::tr1::shared_ptr<streamShare::messageListener> > > >::_M_erase(std::_Rb_tree_node<std::pair<char const* const, std::tr1::shared_ptr<streamShare::messageListener> > >*) (stl_tree.h:970) ==25795== Address 0x42c3358 is 0 bytes inside a block of size 8 free'd ==25795== at 0x402454D: operator delete(void*) (vg_replace_malloc.c:346) ==25795== by 0x804BCC0: std::tr1::_Sp_deleter<streamShare::messageListener>::operator()(streamShare::messageListener*) const (shared_ptr.h:97) ==25795== by 0x804BC7F: std::tr1::_Sp_counted_base_impl<streamShare::messageListener*, std::tr1::_Sp_deleter<streamShare::messageListener>, (__gnu_cxx::_Lock_policy)2>::_M_dispose() (shared_ptr.h:75) ==25795== by 0x804AAF7: std::tr1::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release() (boost_sp_counted_base.h:140) ==25795== by 0x804A58D: std::tr1::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count() (shared_ptr.h:153) ==25795== by 0x804A173: std::tr1::__shared_ptr<streamShare::messageListener, (__gnu_cxx::_Lock_policy)2>::~__shared_ptr() (shared_ptr.h:358) ==25795== by 0x804A186: std::tr1::shared_ptr<streamShare::messageListener>::~shared_ptr() (shared_ptr.h:834) ==25795== by 0x804A405: std::pair<char const* const, std::tr1::shared_ptr<streamShare::messageListener> >::~pair() (stl_pair.h:68) ==25795== by 0x804D3D0: __gnu_cxx::new_allocator<std::pair<char const* const, std::tr1::shared_ptr<streamShare::messageListener> > >::destroy(std::pair<char const* const, std::tr1::shared_ptr<streamShare::messageListener> >*) (new_allocator.h:115) ==25795== by 0x804D337: std::_Rb_tree<char const*, std::pair<char const* const, std::tr1::shared_ptr<streamShare::messageListener> >, std::_Select1st<std::pair<char const* const, std::tr1::shared_ptr<streamShare::messageListener> > >, streamShare::ltstr, std::allocator<std::pair<char const* const, std::tr1::shared_ptr<streamShare::messageListener> > > >::_M_destroy_node(std::_Rb_tree_node<std::pair<char const* const, std::tr1::shared_ptr<streamShare::messageListener> > >*) (stl_tree.h:383) ==25795== by 0x804D29B: std::_Rb_tree<char const*, std::pair<char const* const, std::tr1::shared_ptr<streamShare::messageListener> >, std::_Select1st<std::pair<char const* const, std::tr1::shared_ptr<streamShare::messageListener> > >, streamShare::ltstr, std::allocator<std::pair<char const* const, std::tr1::shared_ptr<streamShare::messageListener> > > >::_M_erase(std::_Rb_tree_node<std::pair<char const* const, std::tr1::shared_ptr<streamShare::messageListener> > >*) (stl_tree.h:972) ==25795== by 0x804D27B: std::_Rb_tree<char const*, std::pair<char const* const, std::tr1::shared_ptr<streamShare::messageListener> >, std::_Select1st<std::pair<char const* const, std::tr1::shared_ptr<streamShare::messageListener> > >, streamShare::ltstr, std::allocator<std::pair<char const* const, std::tr1::shared_ptr<streamShare::messageListener> > > >::_M_erase(std::_Rb_tree_node<std::pair<char const* const, std::tr1::shared_ptr<streamShare::messageListener> > >*) (stl_tree.h:970) ==25795== ==25795== ==25795== HEAP SUMMARY: ==25795== in use at exit: 0 bytes in 0 blocks ==25795== total heap usage: 22 allocs, 30 frees, 496 bytes allocated ==25795== ==25795== All heap blocks were freed -- no leaks are possible ==25795== ==25795== For counts of detected and suppressed errors, rerun with: -v ==25795== ERROR SUMMARY: 8 errors from 1 contexts (suppressed: 19 from 8)