COMPMID-1271 Avoid memory leak in list of gemm methods

Change-Id: I80764d09bf5fb87b3a98bc0e1803d25c6c682c1f
Reviewed-on: https://eu-gerrit-1.euhpc.arm.com/139859
Reviewed-by: Georgios Pinitas <georgios.pinitas@arm.com>
Tested-by: Jenkins <bsgcomp@arm.com>
diff --git a/src/core/NEON/kernels/arm_gemm/gemm_fp16.cpp b/src/core/NEON/kernels/arm_gemm/gemm_fp16.cpp
index 829ae32..4579ebd 100644
--- a/src/core/NEON/kernels/arm_gemm/gemm_fp16.cpp
+++ b/src/core/NEON/kernels/arm_gemm/gemm_fp16.cpp
@@ -73,11 +73,16 @@
     GemmImpl_gemm_fp16_interleaved() : GemmImplementation<__fp16, __fp16>(GemmMethod::GEMM_INTERLEAVED) { }
 };
 
+#if defined(__aarch64__) && (defined(__ARM_FEATURE_VECTOR_ARITHMETIC) || defined(FP16_KERNELS))
+static GemmImpl_gemm_fp16_interleaved_fp16 gemm_fp16_interleaved_fp16_impl{};
+#endif
+static GemmImpl_gemm_fp16_interleaved gemm_fp16_interleaved_impl{};
+
 static std::vector<GemmImplementation<__fp16, __fp16> *> gemm_fp16_methods = {
 #if defined(__aarch64__) && (defined(__ARM_FEATURE_VECTOR_ARITHMETIC) || defined(FP16_KERNELS))
-    new GemmImpl_gemm_fp16_interleaved_fp16(),
+    &gemm_fp16_interleaved_fp16_impl,
 #endif
-    new GemmImpl_gemm_fp16_interleaved()
+    &gemm_fp16_interleaved_impl
 };
 
 template<>
diff --git a/src/core/NEON/kernels/arm_gemm/gemm_fp32.cpp b/src/core/NEON/kernels/arm_gemm/gemm_fp32.cpp
index 6e47adb..e840e90 100644
--- a/src/core/NEON/kernels/arm_gemm/gemm_fp32.cpp
+++ b/src/core/NEON/kernels/arm_gemm/gemm_fp32.cpp
@@ -104,15 +104,23 @@
     GemmImpl_sgemm_gemm_interleaved() : GemmImplementation<float, float>(GemmMethod::GEMM_INTERLEAVED) { }
 };
 
+static GemmImpl_gemv_batched<float, float> gemv_batched_impl{};
+#ifdef __aarch64__
+static GemmImpl_sgemm_gemv_pretransposed sgemm_gemv_pretransposed_impl{};
+static GemmImpl_sgemm_gemv_native_transposed sgemm_gemv_native_transposed_impl{};
+static GemmImpl_sgemm_gemm_native sgemm_gemm_native_impl{};
+#endif
+static GemmImpl_sgemm_gemm_interleaved sgemm_gemm_interleaved_impl{};
+
 /* List of implementations (order matters) */
 static std::vector<GemmImplementation<float, float> *> SGemmMethods = {
-    new GemmImpl_gemv_batched<float, float>(),
+    &gemv_batched_impl,
 #ifdef __aarch64__
-    new GemmImpl_sgemm_gemv_pretransposed(),
-    new GemmImpl_sgemm_gemv_native_transposed(),
-    new GemmImpl_sgemm_gemm_native(),
+    &sgemm_gemv_pretransposed_impl,
+    &sgemm_gemv_native_transposed_impl,
+    &sgemm_gemm_native_impl,
 #endif
-    new GemmImpl_sgemm_gemm_interleaved()
+    &sgemm_gemm_interleaved_impl
 };
 
 /* Templated function to return this list. */
diff --git a/src/core/NEON/kernels/arm_gemm/gemm_int16.cpp b/src/core/NEON/kernels/arm_gemm/gemm_int16.cpp
index f61cc13..b7e8fa2 100644
--- a/src/core/NEON/kernels/arm_gemm/gemm_int16.cpp
+++ b/src/core/NEON/kernels/arm_gemm/gemm_int16.cpp
@@ -41,8 +41,10 @@
     GemmImpl_gemm_s16_interleaved() : GemmImplementation<int16_t, int32_t>(GemmMethod::GEMM_INTERLEAVED) { }
 };
 
+static GemmImpl_gemm_s16_interleaved gemm_s16_interleaved_impl{};
+
 static std::vector<GemmImplementation<int16_t, int32_t> *> gemm_s16_methods = {
-    new GemmImpl_gemm_s16_interleaved()
+    &gemm_s16_interleaved_impl
 };
 
 template<>
diff --git a/src/core/NEON/kernels/arm_gemm/gemm_int8.cpp b/src/core/NEON/kernels/arm_gemm/gemm_int8.cpp
index f50b399..dffa056 100644
--- a/src/core/NEON/kernels/arm_gemm/gemm_int8.cpp
+++ b/src/core/NEON/kernels/arm_gemm/gemm_int8.cpp
@@ -56,9 +56,12 @@
     GemmImpl_gemm_s8_interleaved() : GemmImplementation<int8_t, int32_t>(GemmMethod::GEMM_INTERLEAVED) { }
 };
 
+static GemmImpl_gemm_s8_interleaved_dot gemm_s8_interleaved_dot_impl{};
+static GemmImpl_gemm_s8_interleaved gemm_s8_interleaved_impl{};
+
 static std::vector<GemmImplementation<int8_t, int32_t> *> gemm_s8_methods = {
-    new GemmImpl_gemm_s8_interleaved_dot(),
-    new GemmImpl_gemm_s8_interleaved()
+    &gemm_s8_interleaved_dot_impl,
+    &gemm_s8_interleaved_impl
 };
 
 template<>
diff --git a/src/core/NEON/kernels/arm_gemm/gemm_uint16.cpp b/src/core/NEON/kernels/arm_gemm/gemm_uint16.cpp
index f4b712c..feea482 100644
--- a/src/core/NEON/kernels/arm_gemm/gemm_uint16.cpp
+++ b/src/core/NEON/kernels/arm_gemm/gemm_uint16.cpp
@@ -41,8 +41,10 @@
     GemmImpl_gemm_u16_interleaved() : GemmImplementation<uint16_t, uint32_t>(GemmMethod::GEMM_INTERLEAVED) { }
 };
 
+static GemmImpl_gemm_u16_interleaved gemm_u16_interleaved_impl{};
+
 static std::vector<GemmImplementation<uint16_t, uint32_t> *> gemm_u16_methods = {
-    new GemmImpl_gemm_u16_interleaved()
+    &gemm_u16_interleaved_impl
 };
 
 template<>
diff --git a/src/core/NEON/kernels/arm_gemm/gemm_uint8.cpp b/src/core/NEON/kernels/arm_gemm/gemm_uint8.cpp
index d97dd5c..60b7954 100644
--- a/src/core/NEON/kernels/arm_gemm/gemm_uint8.cpp
+++ b/src/core/NEON/kernels/arm_gemm/gemm_uint8.cpp
@@ -56,9 +56,12 @@
     GemmImpl_gemm_u8_interleaved() : GemmImplementation<uint8_t, uint32_t>(GemmMethod::GEMM_INTERLEAVED) { }
 };
 
+static GemmImpl_gemm_u8_interleaved_dot gemm_u8_interleaved_dot_impl{};
+static GemmImpl_gemm_u8_interleaved gemm_u8_interleaved_impl{};
+
 static std::vector<GemmImplementation<uint8_t, uint32_t> *> gemm_u8_methods = {
-    new GemmImpl_gemm_u8_interleaved_dot(),
-    new GemmImpl_gemm_u8_interleaved()
+    &gemm_u8_interleaved_dot_impl,
+    &gemm_u8_interleaved_impl
 };
 
 template<>