diff --git a/src/one-body-sample.cc b/src/one-body-sample.cc
index b296fdcd43de74bb54f8709e3e1494f3c161be83..984eb1bc906d06bb1087022d224b67a662e076a4 100644
--- a/src/one-body-sample.cc
+++ b/src/one-body-sample.cc
@@ -228,7 +228,9 @@ int main(int argc, char *argv[]) {
       std::fill(normalStress.begin(), normalStress.end(),
                 parset.get<double>("boundary.friction.normalstress"));
 
-      Dune::GlobalNonlinearity<dim> *myGlobalNonlinearity;
+      typedef Dune::shared_ptr<Dune::GlobalNonlinearity<dim>>
+      globalNonlinearityPtr;
+      globalNonlinearityPtr myGlobalNonlinearity;
 
       std::string const friction_model =
           parset.get<std::string>("boundary.friction.model");
@@ -243,12 +245,13 @@ int main(int argc, char *argv[]) {
         std::fill(eta.begin(), eta.end(),
                   parset.get<double>("boundary.friction.eta"));
 
-        myGlobalNonlinearity = new Dune::GlobalRuinaNonlinearity<dim>(
-            nodalIntegrals, a, mu, eta, normalStress);
-      } else if (friction_model == std::string("Laursen")) {
         myGlobalNonlinearity =
+            globalNonlinearityPtr(new Dune::GlobalRuinaNonlinearity<dim>(
+                nodalIntegrals, a, mu, eta, normalStress));
+      } else if (friction_model == std::string("Laursen")) {
+        myGlobalNonlinearity = globalNonlinearityPtr(
             new Dune::GlobalLaursenNonlinearity<dim, Dune::LinearFunction>(
-                mu, normalStress, nodalIntegrals);
+                mu, normalStress, nodalIntegrals));
       } else {
         assert(false);
       }
@@ -264,7 +267,6 @@ int main(int argc, char *argv[]) {
                                       solver_tolerance, &energyNorm,
                                       Solver::QUIET);
         solver.solve();
-        free(myGlobalNonlinearity);
       }
 
       auto *displacement =