diff --git a/CMakeModules/testing_cpp.cmake b/CMakeModules/testing_cpp.cmake
index 7310ec827f3a4af08865fbfffce06bf1b573f21a..c0d74248b161e5e051de342daf753b8f42c6f609 100644
--- a/CMakeModules/testing_cpp.cmake
+++ b/CMakeModules/testing_cpp.cmake
@@ -2,6 +2,8 @@ if (BUILD_TESTS)
     enable_testing()
     set(HIDRA2_MINIMUM_COVERAGE 70)
     find_package(Threads)
+    find_program(MEMORYCHECK_COMMAND valgrind)
+    set( MEMORYCHECK_COMMAND_OPTIONS "--trace-children=yes --leak-check=full --error-exitcode=1" )
 endif ()
 
 function(gtest target test_source_files test_libraries)
@@ -30,5 +32,13 @@ function(gtest target test_source_files test_libraries)
             set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} PARENT_SCOPE)
             set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} PARENT_SCOPE)
         endif ()
+
+        if (MEMORYCHECK_COMMAND)
+            set(memcheck_args ${MEMORYCHECK_COMMAND_OPTIONS})
+            separate_arguments(memcheck_args)
+            add_test(NAME memcheck-${target} COMMAND ${MEMORYCHECK_COMMAND} ${memcheck_args}
+                    ${CMAKE_CURRENT_BINARY_DIR}/test-${target})
+            set_tests_properties(memcheck-${target} PROPERTIES LABELS "memcheck;all")
+        endif()
     endif ()
 endfunction()
diff --git a/common/cpp/src/system_io.cpp b/common/cpp/src/system_io.cpp
index 4d9166497f70fd1c9edfa11aabf22a9bd29fbd8c..96bee71161ea1ac6921893af43524917cd889cf4 100644
--- a/common/cpp/src/system_io.cpp
+++ b/common/cpp/src/system_io.cpp
@@ -3,17 +3,17 @@
 #include <system_wrappers/system_io.h>
 
 int hidra2::SystemIO::open(const char *__file, int __oflag) {
-  return ::open(__file, __oflag);
+    return ::open(__file, __oflag);
 }
 
 int hidra2::SystemIO::close(int __fd) {
-  return ::close(__fd);
+    return ::close(__fd);
 }
 
 ssize_t hidra2::SystemIO::read(int __fd, void *buf, size_t count) {
-  return ::read(__fd, buf, count);
+    return ::read(__fd, buf, count);
 }
 
 ssize_t hidra2::SystemIO::write(int __fd, const void *__buf, size_t __n) {
-  return ::write(__fd, __buf, __n);
+    return ::write(__fd, __buf, __n);
 }
diff --git a/producer/api/unittests/test_producer.cpp b/producer/api/unittests/test_producer.cpp
index ea06e427054fb2d85c69b4c3714ec00e83d89026..6522702215d4ce9f78a110dba4983c71c9e1dc69 100644
--- a/producer/api/unittests/test_producer.cpp
+++ b/producer/api/unittests/test_producer.cpp
@@ -9,5 +9,6 @@ TEST(VERSION, VersionAboveZero) {
 TEST(CreateProducer, PointerIsNotNullptr) {
     hidra2::Producer* prod = hidra2::Producer::CreateProducer("127.0.0.1");
     EXPECT_NE(prod, nullptr);
+    delete prod;
 }
 }