]> OCCT Git - occt-copy.git/commitdiff
0022788: Exception during closing of document due to corrupted memory
authorGKA <>
Fri, 11 Nov 2011 16:04:04 +0000 (16:04 +0000)
committerbugmaster <bugmaster@opencascade.com>
Mon, 5 Mar 2012 15:31:05 +0000 (19:31 +0400)
src/TNaming/TNaming_NamedShape.cxx
src/TNaming/TNaming_UsedShapes.cxx

index d5db2a2f2183aa831d2c5d0626ba67217fe423f1..d82752df0b8f627675eb628309c3f39ce3ea5f70 100755 (executable)
@@ -192,27 +192,31 @@ static void RemoveNode(Standard_Boolean                   MapExist ,
     if (pos->FirstUse() == N) {
       TNaming_Node*  nextOld = N->nextSameOld;
       if (nextOld != 0L) 
-       pos->FirstUse(nextOld);
-      else 
-       // le shape disparait
-       if (MapExist){
-         M.UnBind(pos->Shape());
-#ifdef BUC60921
-         N->myOld = 0L;
-         if(pos != N->myNew)
-           delete pos;
-#endif 
-       }
+        pos->FirstUse(nextOld);
+      else {
+        // le shape disparait
+        if (MapExist)
+          M.UnBind(pos->Shape());
+        //#ifdef BUC60921
+        N->myOld = 0L;
+        if(pos != N->myNew)
+        {
+          delete pos;
+          pos = 0L;
+        }
+        //#endif 
+      }
     }
     else {
       TNaming_Node* pdn = pos->FirstUse();
       while (pdn != 0L) {
-       if (pdn->NextSameShape(pos) == N) {
-         if (pdn->myOld == pos) pdn->nextSameOld =  N->nextSameOld;
-         else                   pdn->nextSameNew =  N->nextSameOld;
-         break;
-       }
-       pdn = pdn->NextSameShape(pos);
+        
+        if (pdn->NextSameShape(pos) == N) {
+          if (pdn->myOld == pos) pdn->nextSameOld =  N->nextSameOld;
+          else                   pdn->nextSameNew =  N->nextSameOld;
+          break;
+        }
+        pdn = pdn->NextSameShape(pos);
       }
     }
   }
@@ -222,26 +226,30 @@ static void RemoveNode(Standard_Boolean                   MapExist ,
     if (pns->FirstUse() == N) {
       TNaming_Node*  nextNew = N->nextSameNew;
       if (nextNew != 0L) 
-       pns->FirstUse(nextNew);
+        pns->FirstUse(nextNew);
       else 
-       // le shape disparait
-       if (MapExist) {
-         M.UnBind(pns->Shape());
-#ifdef BUC60921
-         N->myNew = 0L;
-         delete pns;
-#endif 
-       }
+      {
+        // le shape disparait
+        if (MapExist) 
+          M.UnBind(pns->Shape());
+      
+        pns->FirstUse(0L);
+        delete pns;
+        pns = 0L;
+
+        N->myNew = 0L;
+      
+      }
     }
     else {
       TNaming_Node* pdn = pns->FirstUse();
       while (pdn != 0L) {
-       if (pdn->NextSameShape(pns) == N) {
-         if (pdn->myOld == pns) pdn->nextSameOld =  N->nextSameNew;
-         else                   pdn->nextSameNew =  N->nextSameNew;
-         break;
-       }
-       pdn = pdn->NextSameShape(pns);
+        if (pdn->NextSameShape(pns) == N) {
+          if (pdn->myOld == pns) pdn->nextSameOld =  N->nextSameNew;
+          else                   pdn->nextSameNew =  N->nextSameNew;
+          break;
+        }
+        pdn = pdn->NextSameShape(pns);
       }
     }
   }
@@ -282,8 +290,11 @@ void TNaming_NamedShape::Clear()
   while (p != 0L) {
     q = p;
     p = p->nextSameAttribute;
-    delete q;
-    q = 0L;
+    if( q !=0L)
+    {
+      delete q;
+      q = 0L;
+    }
   }
     
   myNode = 0L;
@@ -347,8 +358,11 @@ Standard_Boolean TNaming_NamedShape::AfterUndo
     while (p != 0L) {
       q = p;
       p = p->nextSameAttribute;
-      delete q;
-      q = 0L;
+      if(q != 0L)
+      {
+        delete q;
+        q = 0L;
+      }
     }
 
     myNode = 0L;
index 313d8b7a04dd6768e96997a53d604286c0e38560..3456393f2b01b9bc656bb176ab30bade086c2bc7 100755 (executable)
@@ -9,7 +9,7 @@
 #include <TDF_DeltaOnAddition.hxx>
 #include <TNaming_DataMapIteratorOfDataMapOfShapePtrRefShape.hxx>
 #include <TNaming_RefShape.hxx>
-
+#include <TNaming_PtrNode.hxx>
 #define BUC60862
 
 #ifdef BUC60862
@@ -46,10 +46,6 @@ TNaming_UsedShapes::TNaming_UsedShapes()
 
 void TNaming_UsedShapes::Destroy() 
 {
-  TNaming_DataMapIteratorOfDataMapOfShapePtrRefShape itr(myMap);
-  for (; itr.More(); itr.Next()) {
-   if(itr.Value() != NULL) delete itr.Value(); // <== szy: removed "//"
-  }
   myMap.Clear();
 }