From bea5cc7dfd80f760d6fe1ff1b16c1b056d30e706 Mon Sep 17 00:00:00 2001
From: Guillaume Pasero <guillaume.pasero@c-s.fr>
Date: Fri, 12 Jul 2019 12:07:11 +0200
Subject: [PATCH] BUG: ProductFormatter doesn't have to be a LightObject, avoid
 memory leak

---
 ProductFormatter/include/ProductCreatorAdapter.h         | 9 +++++++--
 ProductFormatter/include/ProductCreatorSentinelMuscate.h | 5 +++++
 ProductFormatter/include/ProductCreatorVenusMuscate.h    | 5 +++++
 ProductFormatter/src/ProductCreatorAdapter.cpp           | 5 +++++
 ProductFormatter/src/ProductCreatorSentinelMuscate.cpp   | 5 +++++
 ProductFormatter/src/ProductCreatorVenusMuscate.cpp      | 5 +++++
 ProductFormatter/src/ProductFormatter.cpp                | 2 --
 7 files changed, 32 insertions(+), 4 deletions(-)

diff --git a/ProductFormatter/include/ProductCreatorAdapter.h b/ProductFormatter/include/ProductCreatorAdapter.h
index c6d4b9c..c16922a 100644
--- a/ProductFormatter/include/ProductCreatorAdapter.h
+++ b/ProductFormatter/include/ProductCreatorAdapter.h
@@ -34,7 +34,6 @@
 #include "ProductDefinitions.h"
 #include "BaseImageTypes.h"
 #include "otbVectorImageToImageListFilter.h"
-#include "itkLightObject.h"
 
 /**
  * @brief The TemporalSynthesis namespace, covering all needed functions to execute this processing chain
@@ -44,8 +43,14 @@ namespace ts {
 /**
  * @brief Adapter for all Product-formatters of each platform
  */
-class ProductCreatorAdapter : public itk::LightObject, public BaseImageTypes{
+class ProductCreatorAdapter : public BaseImageTypes{
 public:
+  /**
+   * @brief Get the name of this class
+   * @return the class name
+   */
+  virtual const char * GetNameOfClass() const;
+
 	/**
 	 * @brief Initialize a ProductFormatter
 	 * @param products The input product filenames
diff --git a/ProductFormatter/include/ProductCreatorSentinelMuscate.h b/ProductFormatter/include/ProductCreatorSentinelMuscate.h
index 4d962fb..5d86487 100644
--- a/ProductFormatter/include/ProductCreatorSentinelMuscate.h
+++ b/ProductFormatter/include/ProductCreatorSentinelMuscate.h
@@ -37,6 +37,11 @@ namespace ts {
 
 class ProductCreatorSentinelMuscate : public ProductCreatorAdapter{
 public:
+  /**
+   * @brief Get the name of this class
+   * @return the class name
+   */
+  virtual const char * GetNameOfClass() const;
 
 	/**
 	 * @brief Create a Sentinel-2 Muscate product inside the specified destination-folder
diff --git a/ProductFormatter/include/ProductCreatorVenusMuscate.h b/ProductFormatter/include/ProductCreatorVenusMuscate.h
index 557b2a3..bb3bf59 100644
--- a/ProductFormatter/include/ProductCreatorVenusMuscate.h
+++ b/ProductFormatter/include/ProductCreatorVenusMuscate.h
@@ -38,6 +38,11 @@ namespace ts {
 
 class ProductCreatorVenusMuscate : public ProductCreatorAdapter{
 public:
+  /**
+   * @brief Get the name of this class
+   * @return the class name
+   */
+  virtual const char * GetNameOfClass() const;
 
 	/**
 	 * @brief Create a Venus Muscate product inside the specified destination-folder
diff --git a/ProductFormatter/src/ProductCreatorAdapter.cpp b/ProductFormatter/src/ProductCreatorAdapter.cpp
index abf894f..83afdff 100644
--- a/ProductFormatter/src/ProductCreatorAdapter.cpp
+++ b/ProductFormatter/src/ProductCreatorAdapter.cpp
@@ -37,6 +37,11 @@
 
 using namespace ts;
 
+const char * ProductCreatorAdapter::GetNameOfClass() const
+{
+  return "ProductCreatorAdapter";
+}
+
 void ProductCreatorAdapter::FillMetadataInfo(std::shared_ptr<MuscateFileMetadata> &metadata)
 {
 	m_tileID = metadata->DatasetIdentification.GeographicalZone;
diff --git a/ProductFormatter/src/ProductCreatorSentinelMuscate.cpp b/ProductFormatter/src/ProductCreatorSentinelMuscate.cpp
index e03a5f4..3219d39 100644
--- a/ProductFormatter/src/ProductCreatorSentinelMuscate.cpp
+++ b/ProductFormatter/src/ProductCreatorSentinelMuscate.cpp
@@ -33,6 +33,11 @@
 
 using namespace ts;
 
+const char * ProductCreatorSentinelMuscate::GetNameOfClass() const
+{
+  return "ProductCreatorSentinelMuscate";
+}
+
 bool ProductCreatorSentinelMuscate::createProduct(const std::string &destination){
 	m_strDestRoot = destination;
 	std::cout << "Sentinel ProductFormatter: " << destination << std::endl;
diff --git a/ProductFormatter/src/ProductCreatorVenusMuscate.cpp b/ProductFormatter/src/ProductCreatorVenusMuscate.cpp
index 3b1834b..4268a9d 100644
--- a/ProductFormatter/src/ProductCreatorVenusMuscate.cpp
+++ b/ProductFormatter/src/ProductCreatorVenusMuscate.cpp
@@ -31,6 +31,11 @@
 
 using namespace ts;
 
+const char * ProductCreatorVenusMuscate::GetNameOfClass() const
+{
+  return "ProductCreatorVenusMuscate";
+}
+
 bool ProductCreatorVenusMuscate::createProduct(const std::string &destination){
 	m_strDestRoot = destination;
 	std::cout << "Venus ProductFormatter: " << destination << std::endl;
diff --git a/ProductFormatter/src/ProductFormatter.cpp b/ProductFormatter/src/ProductFormatter.cpp
index 0d2cdfd..b81fdbc 100644
--- a/ProductFormatter/src/ProductFormatter.cpp
+++ b/ProductFormatter/src/ProductFormatter.cpp
@@ -145,8 +145,6 @@ private:
 		if(m_creator->createProduct(destination) == false){
 			itkExceptionMacro("Error in product creation of " << destination);
 		}
-		m_creator.release(); //needed as otherwise ITK will throw a warning about deletion of a still-referenced object
-		return;
 	}
 
 	/**
-- 
GitLab