From 980ce9debc9a148dc96ca9ecbef0d6608c63ef4e Mon Sep 17 00:00:00 2001
From: Max Kahnt <max.kahnt@fu-berlin.de>
Date: Mon, 9 Oct 2017 16:32:16 +0200
Subject: [PATCH] Hold transfer operators with shared pointers instead of raw
 pointers.

---
 dune/solvers/iterationsteps/obstacletnnmgstep.hh |  2 +-
 dune/solvers/test/multigridtest.cc               | 11 +++++++----
 dune/solvers/test/obstacletnnmgtest.cc           |  7 +++----
 3 files changed, 11 insertions(+), 9 deletions(-)

diff --git a/dune/solvers/iterationsteps/obstacletnnmgstep.hh b/dune/solvers/iterationsteps/obstacletnnmgstep.hh
index 09e2db71..009ffcf3 100644
--- a/dune/solvers/iterationsteps/obstacletnnmgstep.hh
+++ b/dune/solvers/iterationsteps/obstacletnnmgstep.hh
@@ -67,7 +67,7 @@ class ObstacleTNNMGStep
         typedef typename Dune::BitSetVector<VectorType::block_type::dimension> BitVector;
 
         typedef MultigridTransfer<Vector, BitVector, Matrix> Transfer;
-        typedef typename std::vector<Transfer*> TransferPointerVector;
+        typedef typename std::vector<std::shared_ptr<Transfer>> TransferPointerVector;
 
     protected:
 
diff --git a/dune/solvers/test/multigridtest.cc b/dune/solvers/test/multigridtest.cc
index d387649e..ea5fa69b 100644
--- a/dune/solvers/test/multigridtest.cc
+++ b/dune/solvers/test/multigridtest.cc
@@ -55,10 +55,13 @@ struct MultigridTestSuite
         typedef MultigridTransfer<Vector, BitVector, Matrix> Transfer;
         typedef CompressedMultigridTransfer<Vector, BitVector, Matrix> TransferImplementation;
 
-        // create transfer operators from level i to i+1 (note that this will only work for either uniformly refined grids or adaptive grids with RefinementType=COPY)
-        std::vector<Transfer> transfer(grid.maxLevel());
-        for (size_t i = 0; i < transfer.size(); ++i) {
-            transfer[i].setup(grid, i, i+1);
+        std::vector<std::shared_ptr<Transfer>> transfer(grid.maxLevel());
+        for (size_t i = 0; i < transfer.size(); ++i)
+        {
+            // create transfer operators from level i to i+1 (note that this will only work for either uniformly refined grids or adaptive grids with RefinementType=COPY)
+            auto t = std::make_shared<TransferImplementation>();
+            t->setup(grid, i, i+1);
+            transfer[i] = t;
         }
 
         // set up smoothers and basesolver
diff --git a/dune/solvers/test/obstacletnnmgtest.cc b/dune/solvers/test/obstacletnnmgtest.cc
index d7a55e48..23858a85 100644
--- a/dune/solvers/test/obstacletnnmgtest.cc
+++ b/dune/solvers/test/obstacletnnmgtest.cc
@@ -53,12 +53,11 @@ void solveObstacleProblemByTNNMG(const GridType& grid, const MatrixType& mat, Ve
 
     const int blockSize = VectorType::block_type::dimension;
 
-    // we need a vector of pointers to the transfer operator base class
-    std::vector<Transfer*> transfer(grid.maxLevel());
+    std::vector<std::shared_ptr<Transfer>> transfer(grid.maxLevel());
     for (size_t i = 0; i < transfer.size(); ++i)
     {
-        // create transfer operator from level i to i+1
-        TransferImplementation* t = new TransferImplementation;
+        // create transfer operators from level i to i+1
+        auto t = std::make_shared<TransferImplementation>();
         t->setup(grid, i, i+1);
         transfer[i] = t;
     }
-- 
GitLab