$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r56738 - trunk/libs/serialization/src
From: ramey_at_[hidden]
Date: 2009-10-12 12:29:03
Author: ramey
Date: 2009-10-12 12:29:03 EDT (Mon, 12 Oct 2009)
New Revision: 56738
URL: http://svn.boost.org/trac/boost/changeset/56738
Log:
fix memory leaks
Text files modified: 
   trunk/libs/serialization/src/void_cast.cpp |    35 ++++++++++++++++-------------------     
   1 files changed, 16 insertions(+), 19 deletions(-)
Modified: trunk/libs/serialization/src/void_cast.cpp
==============================================================================
--- trunk/libs/serialization/src/void_cast.cpp	(original)
+++ trunk/libs/serialization/src/void_cast.cpp	2009-10-12 12:29:03 EDT (Mon, 12 Oct 2009)
@@ -100,9 +100,10 @@
         extended_type_info const * derived,
         extended_type_info const * base,
         std::ptrdiff_t difference,
-        bool includes_virtual_base
+        bool includes_virtual_base,
+        void_caster const * const parent
     ) :
-        void_caster(derived, base, difference, true /*heap*/),
+        void_caster(derived, base, difference, parent),
         m_includes_virtual_base(includes_virtual_base)
     {
         recursive_register(includes_virtual_base);
@@ -211,18 +212,20 @@
                 (*it)->m_derived, 
                 m_base,
                 m_difference + (*it)->m_difference,
-                includes_virtual_base
+                includes_virtual_base,
+                this
             );
         if(* (*it)->m_derived == * m_base)
             new void_caster_shortcut(
                 m_derived, 
                 (*it)->m_base, 
                 m_difference + (*it)->m_difference,
-                includes_virtual_base
+                includes_virtual_base,
+                this
             );
     }
 }
-                         
+
 BOOST_SERIALIZATION_DECL(void)
 void_caster::recursive_unregister() const {
     if(void_caster_registry::is_destroyed())
@@ -237,23 +240,17 @@
         if(
             m_base == (*it)->m_base
         &&  m_derived == (*it)->m_derived
-        ||
-            ! m_derived_observer.expired()
-        && ! (*it)->m_base_observer.expired()
-        && *m_derived == *(*it)->m_base
-        ||
-            ! m_base_observer.expired()
-        && ! (*it)->m_derived_observer.expired()
-        && *(*it)->m_derived == *m_base
         ){
+            s.erase(it++);
+        }
+        else
+        if( (*it)->m_parent == this ){
             // since recursion could invalidate it
+            // save pointer to set member
             const void_caster * vc = *it;
-            s.erase(it);
-            if(vc->m_heap){
-                // save pointer to set member
-                // and erase first
-                delete vc;
-            }
+            // and erase first
+            s.erase(it++);
+            delete vc;
             it = s.begin();
         }
         else