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