]> SALOME platform Git repositories - modules/geom.git/commitdiff
Salome HOME
Some protection from usage of removed objects whose data label
authoreap <eap@opencascade.com>
Fri, 4 Oct 2013 14:25:30 +0000 (14:25 +0000)
committereap <eap@opencascade.com>
Fri, 4 Oct 2013 14:25:30 +0000 (14:25 +0000)
is reused by a new object

src/GEOM/GEOM_Engine.cxx

index 711ef4595e6e3c9c44f27cc1ff8cb339e5ecb91a..f486e24c0a4f1297921dbd0b28382722f441b95c 100644 (file)
@@ -462,7 +462,12 @@ bool GEOM_Engine::RemoveObject(Handle(GEOM_BaseObject)& theObject)
 
   //Remove an object from the map of available objects
   TCollection_AsciiString anID = BuildIDFromObject(theObject);
-  if (_objects.IsBound(anID)) _objects.UnBind(anID);
+  if (_objects.IsBound(anID)) {
+    Handle(GEOM_BaseObject) anObject = Handle(GEOM_BaseObject)::DownCast(_objects(anID));
+    if ( anObject != theObject )
+      anObject->_label = anObject->_label.Root();
+    _objects.UnBind(anID);
+  }
 
   // If sub-shape, remove it from the list of sub-shapes of its main shape
   Handle(GEOM_Object) aGO = Handle(GEOM_Object)::DownCast( theObject );
@@ -491,6 +496,13 @@ bool GEOM_Engine::RemoveObject(Handle(GEOM_BaseObject)& theObject)
   if ( aFreeLabels.empty() || aFreeLabels.back() != aLabel )
     aFreeLabels.push_back(aLabel);
 
+  // we can't explicitely delete theObject. At least prevent its functioning
+  // as an alive object when aLabel is reused for a new object
+  theObject->_label = aLabel.Root();
+  theObject->_ior.Clear();
+  theObject->_parameters.Clear();
+  theObject->_docID = -1;
+
   theObject.Nullify();
 
   return true;