0024276: Memory leak due to a static variable
authorvro <vro@opencascade.com>
Tue, 22 Oct 2013 04:49:01 +0000 (08:49 +0400)
committerabv <abv@opencascade.com>
Thu, 24 Oct 2013 12:03:21 +0000 (16:03 +0400)
Cleaning of selected entities to avoid a memory leak.

src/AIS/AIS_InteractiveContext.cxx
src/AIS/AIS_Selection.cdl
src/AIS/AIS_Selection.cxx
src/Visual3d/Visual3d_ViewManager.cxx

index 85547fd..bc7c438 100755 (executable)
@@ -149,6 +149,9 @@ myIsAutoActivateSelMode( Standard_True )
 
 void AIS_InteractiveContext::Delete() const
 {
+  //Clear the static current selection. Else the memory
+  //is not release
+  AIS_Selection::ClearCurrentSelection();
 #ifdef OCC172
   // to avoid an exception
   if ( AIS_Selection::Find( mySelectionName.ToCString() ) )
index ae5fea7..4dd866e 100755 (executable)
@@ -87,6 +87,8 @@ is
     ---Purpose: 
     returns mutable Selection from AIS;
     
+    ClearCurrentSelection(myclass);
+    ---Purpose: Clears selection.
 
     Select(myclass);
     ---Purpose: removes all the object of the currentselection.
index a9d4b02..754a6f5 100755 (executable)
 #define MaxSizeOfResult 100000
 #endif
 
+//current selection (handle)
+static Handle(AIS_Selection) theCurrentSelection;
 static void AIS_Sel_CurrentSelection (Handle(AIS_Selection)& InputSel)     
 {
-  static Handle(AIS_Selection) theCurrentSelection;
   if(!InputSel.IsNull())
     theCurrentSelection = InputSel;
   else
@@ -418,6 +419,11 @@ void AIS_Selection::Remove(const Standard_CString aName)
 #endif
     AIS_Sel_GetSelections().Remove(I);
   }
-  
+}
+
+// clean the static current selection handle
+void AIS_Selection::ClearCurrentSelection()
+{
+    theCurrentSelection.Nullify();
 }
 
index 6ffaf78..c3f0bfa 100755 (executable)
@@ -1061,6 +1061,19 @@ Standard_Integer Visual3d_ViewManager::Identification (const Handle(Visual3d_Vie
 
 void Visual3d_ViewManager::UnIdentification (const Standard_Integer aViewId)
 {
+  Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
+  while (MyIterator.More()) 
+  {
+    if ((MyIterator.Value())->Identification () == aViewId)
+    {
+      const Handle(Visual3d_View)& theView = MyIterator.Value();
+      //remove the view from the list
+      MyDefinedView.Remove(theView);
+      break;
+    }
+    // go to next
+    MyIterator.Next ();
+  }
   MyViewGenId.Free(aViewId);
 }