From 9dce3b836a80b00dd59582e964e23d637a5972d6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org>
Date: Wed, 14 Nov 2018 12:27:57 +0100
Subject: [PATCH] Fix memory leak in k-order DLL related to DynamicModelAC
 instantiation

Adapted from 50a09a687eaa20817c3e7f6cb973e3ad53d6b936, but keeping C++03
compatibility.
---
 .../k_order_perturbation/dynamic_abstract_class.cc  |  4 ++++
 .../k_order_perturbation/dynamic_abstract_class.hh  |  1 +
 .../k_order_perturbation/k_order_perturbation.cc    | 13 ++++++++++++-
 3 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/mex/sources/k_order_perturbation/dynamic_abstract_class.cc b/mex/sources/k_order_perturbation/dynamic_abstract_class.cc
index e0da81e886..dae58d34e9 100644
--- a/mex/sources/k_order_perturbation/dynamic_abstract_class.cc
+++ b/mex/sources/k_order_perturbation/dynamic_abstract_class.cc
@@ -21,6 +21,10 @@
 
 #include "dynamic_abstract_class.hh"
 
+DynamicModelAC::~DynamicModelAC()
+{
+}
+
 void
 DynamicModelAC::copyDoubleIntoTwoDMatData(double *dm, TwoDMatrix *tdm, int rows, int cols)
 {
diff --git a/mex/sources/k_order_perturbation/dynamic_abstract_class.hh b/mex/sources/k_order_perturbation/dynamic_abstract_class.hh
index 8c84dbe013..5449589252 100644
--- a/mex/sources/k_order_perturbation/dynamic_abstract_class.hh
+++ b/mex/sources/k_order_perturbation/dynamic_abstract_class.hh
@@ -25,6 +25,7 @@
 class DynamicModelAC
 {
 public:
+  virtual ~DynamicModelAC();
   static double *unpackSparseMatrix(mxArray *sparseMatrix);
   static void copyDoubleIntoTwoDMatData(double *dm, TwoDMatrix *tdm, int rows, int cols);
   virtual void eval(const Vector &y, const Vector &x, const Vector &params, const Vector &ySteady,
diff --git a/mex/sources/k_order_perturbation/k_order_perturbation.cc b/mex/sources/k_order_perturbation/k_order_perturbation.cc
index 1e6a88cc0d..a0704b2291 100644
--- a/mex/sources/k_order_perturbation/k_order_perturbation.cc
+++ b/mex/sources/k_order_perturbation/k_order_perturbation.cc
@@ -229,6 +229,7 @@ extern "C" {
 
     THREAD_GROUP::max_parallel_threads = 2; //params.num_threads;
 
+    DynamicModelAC *dynamicModelFile = NULL;
     try
       {
         // make journal name and journal
@@ -236,7 +237,6 @@ extern "C" {
         jName += ".jnl";
         Journal journal(jName.c_str());
 
-        DynamicModelAC *dynamicModelFile;
         if (use_dll == 1)
           dynamicModelFile = new DynamicModelDLL(fName);
         else
@@ -323,30 +323,41 @@ extern "C" {
         e.print();
         ostringstream strstrm;
         strstrm << "dynare:k_order_perturbation: Caught Kord exception: " << e.get_message();
+        if (dynamicModelFile)
+          delete dynamicModelFile;
         DYN_MEX_FUNC_ERR_MSG_TXT(strstrm.str().c_str());
       }
     catch (const TLException &e)
       {
         e.print();
+        if (dynamicModelFile)
+          delete dynamicModelFile;
         DYN_MEX_FUNC_ERR_MSG_TXT("dynare:k_order_perturbation: Caught TL exception");
       }
     catch (SylvException &e)
       {
         e.printMessage();
+        if (dynamicModelFile)
+          delete dynamicModelFile;
         DYN_MEX_FUNC_ERR_MSG_TXT("dynare:k_order_perturbation: Caught Sylv exception");
       }
     catch (const DynareException &e)
       {
         ostringstream strstrm;
         strstrm << "dynare:k_order_perturbation: Caught KordDynare exception: " << e.message();
+        if (dynamicModelFile)
+          delete dynamicModelFile;
         DYN_MEX_FUNC_ERR_MSG_TXT(strstrm.str().c_str());
       }
     catch (const ogu::Exception &e)
       {
         ostringstream strstrm;
         strstrm << "dynare:k_order_perturbation: Caught general exception: " << e.message();
+        if (dynamicModelFile)
+          delete dynamicModelFile;
         DYN_MEX_FUNC_ERR_MSG_TXT(strstrm.str().c_str());
       }
+    delete dynamicModelFile;
     plhs[0] = mxCreateDoubleScalar(0);
   } // end of mexFunction()
 } // end of extern C
-- 
GitLab