]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Make TestIntersection work: no crash on remove of PaveFiller before all algorithm...
authormpv <mpv@opencascade.com>
Fri, 26 Oct 2018 14:19:39 +0000 (17:19 +0300)
committermpv <mpv@opencascade.com>
Mon, 19 Nov 2018 08:45:52 +0000 (11:45 +0300)
src/GeomAlgoAPI/GeomAlgoAPI_Intersection.cpp
src/GeomAlgoAPI/GeomAlgoAPI_Intersection.h

index 5793dbf0bd49a6e4bbd8330cf0276551403e7f40..49b7fe423b9988aafb251eda3b613db08d53869d 100644 (file)
 
 //==================================================================================================
 GeomAlgoAPI_Intersection::GeomAlgoAPI_Intersection(const ListOfShape& theObjects)
+  : myFiller(0)
 {
   build(theObjects);
 }
 
+GeomAlgoAPI_Intersection::~GeomAlgoAPI_Intersection() {
+  if (myFiller)
+    delete (BOPAlgo_PaveFiller*)myFiller;
+}
 //==================================================================================================
 void GeomAlgoAPI_Intersection::build(const ListOfShape& theObjects)
 {
@@ -53,21 +58,22 @@ void GeomAlgoAPI_Intersection::build(const ListOfShape& theObjects)
     }
   }
 
-  BOPAlgo_PaveFiller aDSFiller;
-  aDSFiller.SetArguments(anObjects);
+  BOPAlgo_PaveFiller* aDSFiller = new BOPAlgo_PaveFiller;
+  myFiller = aDSFiller;
+  aDSFiller->SetArguments(anObjects);
 
-  aDSFiller.SetRunParallel(false);
-  aDSFiller.SetNonDestructive(false);
-  aDSFiller.SetGlue(BOPAlgo_GlueOff);
+  aDSFiller->SetRunParallel(false);
+  aDSFiller->SetNonDestructive(false);
+  aDSFiller->SetGlue(BOPAlgo_GlueOff);
 
   // optimization for the issue #2399
   BOPAlgo_SectionAttribute theSecAttr(Standard_True,
                                       Standard_True,
                                       Standard_True);
-  aDSFiller.SetSectionAttribute(theSecAttr);
+  aDSFiller->SetSectionAttribute(theSecAttr);
 
-  aDSFiller.Perform();
-  if (aDSFiller.HasErrors()) {
+  aDSFiller->Perform();
+  if (aDSFiller->HasErrors()) {
     return;
   }
 
@@ -75,7 +81,7 @@ void GeomAlgoAPI_Intersection::build(const ListOfShape& theObjects)
   anOperation->SetRunParallel(false);
   anOperation->SetCheckInverted(true);
 
-  anOperation->PerformWithFiller(aDSFiller);
+  anOperation->PerformWithFiller(*aDSFiller); // it references a filler fields, so keep the filler
   if(anOperation->HasErrors()) {
     return;
   }
index 2ea3e0c14d2bce03b2f614d1eac6ac0640730cb3..bd05117696eed9252aa5a06480027f9c236a62e6 100644 (file)
 /// \brief Performs the intersection operations.
 class GeomAlgoAPI_Intersection : public GeomAlgoAPI_MakeShape
 {
+  void* myFiller; ///< store filler to avoid memory leaks
 public:
   /// \brief Constructor.
   /// \param[in] theObjects list of objects.
   /// \param[in] theTools list of tools.
   GEOMALGOAPI_EXPORT GeomAlgoAPI_Intersection(const ListOfShape& theObjects);
 
+  /// Destructor to erase the filler
+  GEOMALGOAPI_EXPORT virtual ~GeomAlgoAPI_Intersection();
+
 private:
   /// Builds resulting shape.
   void build(const ListOfShape& theObjects);
+
 };
 
 #endif