From 576714dabd2227a58b4d3d4331c40c153f86ca16 Mon Sep 17 00:00:00 2001
From: Sebastien Gilles <sebastien.gilles@inria.fr>
Date: Wed, 13 May 2015 15:30:55 +0200
Subject: [PATCH] #552 The bug seems to stem from ComponentManager: the smart
 pointer was used inside a std::function, and when it was a std::unique_ptr it
 led to a double deallocation. I'm a bit surprised the compiler let that pass
 in the first place.

---
 Sources/FiniteElement/BoundaryConditions/Component/Comp1.cpp  | 2 +-
 Sources/FiniteElement/BoundaryConditions/Component/Comp12.cpp | 2 +-
 .../FiniteElement/BoundaryConditions/Component/Comp123.cpp    | 2 +-
 Sources/FiniteElement/BoundaryConditions/Component/Comp13.cpp | 2 +-
 Sources/FiniteElement/BoundaryConditions/Component/Comp2.cpp  | 2 +-
 Sources/FiniteElement/BoundaryConditions/Component/Comp23.cpp | 2 +-
 Sources/FiniteElement/BoundaryConditions/Component/Comp3.cpp  | 2 +-
 Sources/FiniteElement/BoundaryConditions/Component/CompNA.cpp | 2 +-
 Sources/FiniteElement/BoundaryConditions/ComponentManager.hpp | 2 +-
 .../BoundaryConditions/DirichletBoundaryCondition.hpp         | 2 +-
 .../BoundaryConditions/Private/ComponentFactory.cpp           | 4 ++--
 .../BoundaryConditions/Private/ComponentFactory.hpp           | 4 ++--
 12 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/Sources/FiniteElement/BoundaryConditions/Component/Comp1.cpp b/Sources/FiniteElement/BoundaryConditions/Component/Comp1.cpp
index 4b52eeb803..3e0798d2ca 100644
--- a/Sources/FiniteElement/BoundaryConditions/Component/Comp1.cpp
+++ b/Sources/FiniteElement/BoundaryConditions/Component/Comp1.cpp
@@ -24,7 +24,7 @@ namespace HappyHeart
         {
             
             
-            ComponentManager::const_unique_ptr Create()
+            ComponentManager::const_shared_ptr Create()
             {
                 return std::make_unique<Comp1>();
             }
diff --git a/Sources/FiniteElement/BoundaryConditions/Component/Comp12.cpp b/Sources/FiniteElement/BoundaryConditions/Component/Comp12.cpp
index fa9bb9bc9e..e1fff6134c 100644
--- a/Sources/FiniteElement/BoundaryConditions/Component/Comp12.cpp
+++ b/Sources/FiniteElement/BoundaryConditions/Component/Comp12.cpp
@@ -23,7 +23,7 @@ namespace HappyHeart
         {
             
             
-            ComponentManager::const_unique_ptr Create()
+            ComponentManager::const_shared_ptr Create()
             {
                 return std::make_unique<Comp12>();
             }
diff --git a/Sources/FiniteElement/BoundaryConditions/Component/Comp123.cpp b/Sources/FiniteElement/BoundaryConditions/Component/Comp123.cpp
index f1dac4b0a3..14cbc0e747 100644
--- a/Sources/FiniteElement/BoundaryConditions/Component/Comp123.cpp
+++ b/Sources/FiniteElement/BoundaryConditions/Component/Comp123.cpp
@@ -23,7 +23,7 @@ namespace HappyHeart
         {
             
             
-            ComponentManager::const_unique_ptr Create()
+            ComponentManager::const_shared_ptr Create()
             {
                 return std::make_unique<Comp123>();
             }
diff --git a/Sources/FiniteElement/BoundaryConditions/Component/Comp13.cpp b/Sources/FiniteElement/BoundaryConditions/Component/Comp13.cpp
index fb70104564..22571ac2dc 100644
--- a/Sources/FiniteElement/BoundaryConditions/Component/Comp13.cpp
+++ b/Sources/FiniteElement/BoundaryConditions/Component/Comp13.cpp
@@ -23,7 +23,7 @@ namespace HappyHeart
         {
             
             
-            ComponentManager::const_unique_ptr Create()
+            ComponentManager::const_shared_ptr Create()
             {
                 return std::make_unique<Comp13>();
             }
diff --git a/Sources/FiniteElement/BoundaryConditions/Component/Comp2.cpp b/Sources/FiniteElement/BoundaryConditions/Component/Comp2.cpp
index 3b4f7221dd..e5d15efc8e 100644
--- a/Sources/FiniteElement/BoundaryConditions/Component/Comp2.cpp
+++ b/Sources/FiniteElement/BoundaryConditions/Component/Comp2.cpp
@@ -23,7 +23,7 @@ namespace HappyHeart
         {
             
             
-            ComponentManager::const_unique_ptr Create()
+            ComponentManager::const_shared_ptr Create()
             {
                 return std::make_unique<Comp2>();
             }
diff --git a/Sources/FiniteElement/BoundaryConditions/Component/Comp23.cpp b/Sources/FiniteElement/BoundaryConditions/Component/Comp23.cpp
index b4ca779c8a..c70053336c 100644
--- a/Sources/FiniteElement/BoundaryConditions/Component/Comp23.cpp
+++ b/Sources/FiniteElement/BoundaryConditions/Component/Comp23.cpp
@@ -24,7 +24,7 @@ namespace HappyHeart
         {
             
             
-            ComponentManager::const_unique_ptr Create()
+            ComponentManager::const_shared_ptr Create()
             {
                 return std::make_unique<Comp23>();
             }
diff --git a/Sources/FiniteElement/BoundaryConditions/Component/Comp3.cpp b/Sources/FiniteElement/BoundaryConditions/Component/Comp3.cpp
index 95e504189c..cd76d9445a 100644
--- a/Sources/FiniteElement/BoundaryConditions/Component/Comp3.cpp
+++ b/Sources/FiniteElement/BoundaryConditions/Component/Comp3.cpp
@@ -23,7 +23,7 @@ namespace HappyHeart
         {
             
             
-            ComponentManager::const_unique_ptr Create()
+            ComponentManager::const_shared_ptr Create()
             {
                 return std::make_unique<Comp3>();
             }
diff --git a/Sources/FiniteElement/BoundaryConditions/Component/CompNA.cpp b/Sources/FiniteElement/BoundaryConditions/Component/CompNA.cpp
index dcada3781e..42d7798e69 100644
--- a/Sources/FiniteElement/BoundaryConditions/Component/CompNA.cpp
+++ b/Sources/FiniteElement/BoundaryConditions/Component/CompNA.cpp
@@ -24,7 +24,7 @@ namespace HappyHeart
         {
             
             
-            ComponentManager::const_unique_ptr Create()
+            ComponentManager::const_shared_ptr Create()
             {
                 return std::make_unique<CompNA>();
             }
diff --git a/Sources/FiniteElement/BoundaryConditions/ComponentManager.hpp b/Sources/FiniteElement/BoundaryConditions/ComponentManager.hpp
index 200915e267..8d6a1d4bed 100644
--- a/Sources/FiniteElement/BoundaryConditions/ComponentManager.hpp
+++ b/Sources/FiniteElement/BoundaryConditions/ComponentManager.hpp
@@ -27,7 +27,7 @@ namespace HappyHeart
         
         
         //! Shared smart pointer.
-        using const_unique_ptr = std::unique_ptr<const ComponentManager>;
+        using const_shared_ptr = std::shared_ptr<const ComponentManager>;
         
         //! Constructor.
         explicit ComponentManager(const std::string& name, std::bitset<3> is_activated);
diff --git a/Sources/FiniteElement/BoundaryConditions/DirichletBoundaryCondition.hpp b/Sources/FiniteElement/BoundaryConditions/DirichletBoundaryCondition.hpp
index 19c0a30daf..39aef0813a 100644
--- a/Sources/FiniteElement/BoundaryConditions/DirichletBoundaryCondition.hpp
+++ b/Sources/FiniteElement/BoundaryConditions/DirichletBoundaryCondition.hpp
@@ -109,7 +109,7 @@ namespace HappyHeart
         //! variable concerned by this DirichletBoundaryCondition
         const Unknown& unknown_;
         
-        ComponentManager::const_unique_ptr component_manager_ = nullptr;
+        ComponentManager::const_shared_ptr component_manager_ = nullptr;
         
         /*!
          * \brief List of dofs concerned by the boundary condition and their associated value.
diff --git a/Sources/FiniteElement/BoundaryConditions/Private/ComponentFactory.cpp b/Sources/FiniteElement/BoundaryConditions/Private/ComponentFactory.cpp
index 4d383b318f..477d83d930 100644
--- a/Sources/FiniteElement/BoundaryConditions/Private/ComponentFactory.cpp
+++ b/Sources/FiniteElement/BoundaryConditions/Private/ComponentFactory.cpp
@@ -33,14 +33,14 @@ namespace HappyHeart
         
         
         
-        ComponentManager::const_unique_ptr ComponentFactory::CreateFromName(const std::string& component_name) const
+        ComponentManager::const_shared_ptr ComponentFactory::CreateFromName(const std::string& component_name) const
         {
             auto it = callbacks_.find(component_name);
             
             if (it == callbacks_.cend())
                 throw ExceptionNS::Factory::UnregisteredName(component_name, "component", __FILE__, __LINE__);
             
-            ComponentManager::const_unique_ptr ret = it->second();
+            ComponentManager::const_shared_ptr ret = it->second();
             
             return ret;
         }
diff --git a/Sources/FiniteElement/BoundaryConditions/Private/ComponentFactory.hpp b/Sources/FiniteElement/BoundaryConditions/Private/ComponentFactory.hpp
index bcdbccf771..24c708e30e 100644
--- a/Sources/FiniteElement/BoundaryConditions/Private/ComponentFactory.hpp
+++ b/Sources/FiniteElement/BoundaryConditions/Private/ComponentFactory.hpp
@@ -40,7 +40,7 @@ namespace HappyHeart
             
             
             //! Alias for a function which will create a 'Component'
-            using FunctionPrototype = std::function<ComponentManager::const_unique_ptr()>;
+            using FunctionPrototype = std::function<ComponentManager::const_shared_ptr()>;
             
             /*!
              * \brief Alias for call back.
@@ -68,7 +68,7 @@ namespace HappyHeart
             /*!
              * \brief Create an object according to its name.
              */
-            ComponentManager::const_unique_ptr CreateFromName(const std::string& component_name) const;
+            ComponentManager::const_shared_ptr CreateFromName(const std::string& component_name) const;
             
             //! Number of elements registered in the factory.
             inline CallBack::size_type Nvariable() const;
-- 
GitLab