diff --git a/mex/sources/k_order_perturbation/dynamic_abstract_class.cc b/mex/sources/k_order_perturbation/dynamic_abstract_class.cc
index e0da81e886f952bc92b89ac1e985d0b2d7c3a452..dae58d34e9545ffab39833b246b0d58991b638c5 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 8c84dbe01377d73fb14bbba4afda04723925e4c7..5449589252386a25abbd5b4ae56f5272f5569f00 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 1e6a88cc0da566aa02235066c7ccda0e40ebe14a..a0704b2291fc0a241aa3256dfc0eb51d5eb70c81 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