[serialization] Memoryleak in void_caster::recursive_register

// implementation of void caster base class BOOST_SERIALIZATION_DECL(void) void_caster::recursive_register(bool includes_virtual_base) const { void_cast_detail::set_type & s = void_cast_detail::void_caster_registry::get_mutable_instance(); s.insert(this); // generate all implied void_casts. void_cast_detail::set_type::const_iterator it; for(it = s.begin(); it != s.end(); ++it){ if(m_derived == (*it)->m_base) new void_caster_shortcut( (*it)->m_derived, m_base, m_difference + (*it)->m_difference, includes_virtual_base ); if((*it)->m_derived == m_base) new void_caster_shortcut( m_derived, (*it)->m_base, m_difference + (*it)->m_difference, includes_virtual_base ); } } The new void_caster_shortcut in void_caster::recursive_register give memory leak. The leak is only at startup of program, so it doesn't eat any memory while the program is running. But it makes it difficult to find other memory leaks when the program contain several leaks you don't care about. - Runar

This create objects which register themselves in a global table. The table and objects persist until the execution module ends. Some methods of checking for memory leaks might check before the table and it's members are destroyed so it might look like they are leaks - but they're not. This can be seen by setting a debugger break point on the destructor of voice_cast_shortcut. Robert Ramey Runar Undheim wrote:
// implementation of void caster base class BOOST_SERIALIZATION_DECL(void) void_caster::recursive_register(bool includes_virtual_base) const { void_cast_detail::set_type & s = void_cast_detail::void_caster_registry::get_mutable_instance(); s.insert(this);
// generate all implied void_casts.
void_cast_detail::set_type::const_iterator it; for(it = s.begin(); it != s.end(); ++it){ if(m_derived == (*it)->m_base) new void_caster_shortcut( (*it)->m_derived, m_base, m_difference + (*it)->m_difference, includes_virtual_base ); if((*it)->m_derived == m_base) new void_caster_shortcut( m_derived, (*it)->m_base, m_difference + (*it)->m_difference, includes_virtual_base ); } }
The new void_caster_shortcut in void_caster::recursive_register give memory leak. The leak is only at startup of program, so it doesn't eat any memory while the program is running. But it makes it difficult to find other memory leaks when the program contain several leaks you don't care about.
- Runar _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Thanks! I only trusted the memory leak report from the program :( The memory detection is done when the destructor on a static class i called, but it is not possible to decide which destructor is called first. So I wonder if it is any function I could call to manually free the memory. Then I could call this function in debug build before my code check for memory leaks. - Runar Robert Ramey wrote:
This create objects which register themselves in a global table. The table and objects persist until the execution module ends. Some methods of checking for memory leaks might check before the table and it's members are destroyed so it might look like they are leaks - but they're not. This can be seen by setting a debugger break point on the destructor of voice_cast_shortcut.
Robert Ramey
Runar Undheim wrote:
// implementation of void caster base class BOOST_SERIALIZATION_DECL(void) void_caster::recursive_register(bool includes_virtual_base) const { void_cast_detail::set_type & s = void_cast_detail::void_caster_registry::get_mutable_instance(); s.insert(this);
// generate all implied void_casts.
void_cast_detail::set_type::const_iterator it; for(it = s.begin(); it != s.end(); ++it){ if(m_derived == (*it)->m_base) new void_caster_shortcut( (*it)->m_derived, m_base, m_difference + (*it)->m_difference, includes_virtual_base ); if((*it)->m_derived == m_base) new void_caster_shortcut( m_derived, (*it)->m_base, m_difference + (*it)->m_difference, includes_virtual_base ); } }
The new void_caster_shortcut in void_caster::recursive_register give memory leak. The leak is only at startup of program, so it doesn't eat any memory while the program is running. But it makes it difficult to find other memory leaks when the program contain several leaks you don't care about.
- Runar _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
_______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
participants (2)
-
Robert Ramey
-
Runar Undheim