0028927: Visualization - Graphic3d_StructureManager destructor should invalidate...
authorkgv <kgv@opencascade.com>
Wed, 19 Jul 2017 14:38:54 +0000 (17:38 +0300)
committerbugmaster <bugmaster@opencascade.com>
Fri, 21 Jul 2017 09:10:47 +0000 (12:10 +0300)
Graphic3d_Structure::myFirstStructureManager - removed unused class field.
~Graphic3d_StructureManager() now removes displayed Structures explicitly.

src/Graphic3d/Graphic3d_Structure.cxx
src/Graphic3d/Graphic3d_Structure.hxx
src/Graphic3d/Graphic3d_StructureManager.cxx

index d5b22ed..aa64525 100644 (file)
@@ -41,11 +41,10 @@ IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_Structure,Standard_Transient)
 //purpose  :
 //=============================================================================
 Graphic3d_Structure::Graphic3d_Structure (const Handle(Graphic3d_StructureManager)& theManager)
-: myStructureManager      (theManager.operator->()),
-  myFirstStructureManager (theManager.operator->()),
-  myComputeVisual         (Graphic3d_TOS_ALL),
-  myOwner                 (NULL),
-  myVisual                (Graphic3d_TOS_ALL)
+: myStructureManager(theManager.operator->()),
+  myComputeVisual   (Graphic3d_TOS_ALL),
+  myOwner           (NULL),
+  myVisual          (Graphic3d_TOS_ALL)
 {
   myCStructure = theManager->GraphicDriver()->CreateStructure (theManager);
 }
@@ -56,11 +55,10 @@ Graphic3d_Structure::Graphic3d_Structure (const Handle(Graphic3d_StructureManage
 //=============================================================================
 Graphic3d_Structure::Graphic3d_Structure (const Handle(Graphic3d_StructureManager)& theManager,
                                           const Handle(Graphic3d_Structure)&        thePrs)
-: myStructureManager      (theManager.operator->()),
-  myFirstStructureManager (theManager.operator->()),
-  myComputeVisual         (thePrs->myComputeVisual),
-  myOwner                 (thePrs->myOwner),
-  myVisual                (thePrs->myVisual)
+: myStructureManager(theManager.operator->()),
+  myComputeVisual   (thePrs->myComputeVisual),
+  myOwner           (thePrs->myOwner),
+  myVisual          (thePrs->myVisual)
 {
   myCStructure = thePrs->myCStructure->ShadowLink (theManager);
 }
@@ -71,9 +69,9 @@ Graphic3d_Structure::Graphic3d_Structure (const Handle(Graphic3d_StructureManage
 //=============================================================================
 Graphic3d_Structure::~Graphic3d_Structure()
 {
-  // as myFirstStructureManager can be already destroyed,
+  // as myStructureManager can be already destroyed,
   // avoid attempts to access it
-  myFirstStructureManager = NULL;
+  myStructureManager = NULL;
   Remove();
 }
 
index 94bc1f3..432fe99 100644 (file)
@@ -440,7 +440,6 @@ private:
 protected:
 
   Graphic3d_StructureManager* myStructureManager;
-  Graphic3d_StructureManager* myFirstStructureManager;
   Graphic3d_TypeOfStructure   myComputeVisual;
 
   Handle(Graphic3d_CStructure) myCStructure;
index 081f726..572c27e 100644 (file)
@@ -42,6 +42,11 @@ Graphic3d_StructureManager::Graphic3d_StructureManager (const Handle(Graphic3d_G
 // ========================================================================
 Graphic3d_StructureManager::~Graphic3d_StructureManager()
 {
+  for (Graphic3d_MapIteratorOfMapOfStructure anIt (myDisplayedStructure); anIt.More(); anIt.Next())
+  {
+    anIt.Value()->Remove();
+  }
+
   myDisplayedStructure.Clear();
   myHighlightedStructure.Clear();
   myDefinedViews.Clear();
@@ -66,6 +71,10 @@ void Graphic3d_StructureManager::Update (const Graphic3d_ZLayerId theLayerId) co
 void Graphic3d_StructureManager::Remove()
 {
   // clear all structures whilst views are alive for correct GPU memory management
+  for (Graphic3d_MapIteratorOfMapOfStructure anIt (myDisplayedStructure); anIt.More(); anIt.Next())
+  {
+    anIt.Value()->Remove();
+  }
   myDisplayedStructure.Clear();
   myHighlightedStructure.Clear();