diff --git a/src/algebra/LinearSolver.cpp b/src/algebra/LinearSolver.cpp
index 1965a9966cafdf181b366feb1e41909077edd8ac..b3a4d9816f6bc6634f73a80b70ba304f82ed60b1 100644
--- a/src/algebra/LinearSolver.cpp
+++ b/src/algebra/LinearSolver.cpp
@@ -179,12 +179,6 @@ struct LinearSolver::Internals
     Vec petscX;
     VecCreateMPIWithArray(PETSC_COMM_WORLD, 1, x.size(), x.size(), &x[0], &petscX);
 
-    Mat petscMat;
-    MatCreate(PETSC_COMM_WORLD, &petscMat);
-    MatSetSizes(petscMat, PETSC_DECIDE, PETSC_DECIDE, x.size(), x.size());
-
-    MatSetType(petscMat, MATAIJ);
-
     Array<PetscScalar> values = copy(A.values());
 
     const auto A_row_indices = A.rowIndices();
@@ -202,6 +196,7 @@ struct LinearSolver::Internals
       }
     }
 
+    Mat petscMat;
     MatCreateSeqAIJWithArrays(PETSC_COMM_WORLD, x.size(), x.size(), &row_indices[0], &column_indices[0], &values[0],
                               &petscMat);
 
@@ -292,7 +287,12 @@ struct LinearSolver::Internals
     }
 
     KSPSolve(ksp, petscB, petscX);
+
+    // free used memory
     MatDestroy(&petscMat);
+    VecDestroy(&petscB);
+    VecDestroy(&petscX);
+    KSPDestroy(&ksp);
   }
 
 #else   // PUGS_HAS_PETSC