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 ¶ms, 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