From 72d08b9407dc36cc22acb97cba2d871fb36c46a2 Mon Sep 17 00:00:00 2001 From: Joachim Klein Date: Thu, 8 Sep 2016 13:14:52 +0000 Subject: [PATCH] hybrid engine: consistently use delete[] when destroying solution vectors Technically, using 'plain' delete for deleting objects allocated with new[] is undefined behaviour. In practice, this didn't appear to be a problem. git-svn-id: https://www.prismmodelchecker.org/svn/prism/prism/trunk@11787 bbc10eb1-c90d-0410-af57-cb519fbb1720 --- prism/src/hybrid/PH_JOR.cc | 4 ++-- prism/src/hybrid/PH_NondetBoundedUntil.cc | 4 ++-- prism/src/hybrid/PH_NondetReachReward.cc | 6 +++--- prism/src/hybrid/PH_NondetUntil.cc | 6 +++--- prism/src/hybrid/PH_PSOR.cc | 2 +- prism/src/hybrid/PH_Power.cc | 4 ++-- prism/src/hybrid/PH_ProbBoundedUntil.cc | 2 +- prism/src/hybrid/PH_ProbCumulReward.cc | 2 +- prism/src/hybrid/PH_ProbInstReward.cc | 2 +- prism/src/hybrid/PH_ProbTransient.cc | 2 +- prism/src/hybrid/PH_SOR.cc | 2 +- 11 files changed, 18 insertions(+), 18 deletions(-) diff --git a/prism/src/hybrid/PH_JOR.cc b/prism/src/hybrid/PH_JOR.cc index 6e518388..93de2561 100644 --- a/prism/src/hybrid/PH_JOR.cc +++ b/prism/src/hybrid/PH_JOR.cc @@ -293,7 +293,7 @@ jdouble omega // omega (over-relaxation parameter) PH_PrintToMainLog(env, "\n%s: %d iterations in %.2f seconds (average %.6f, setup %.2f)\n", (omega == 1.0)?"Jacobi":"JOR", iters, time_taken, time_for_iters/iters, time_for_setup); // if the iterative method didn't terminate, this is an error - if (!done) { delete soln; soln = NULL; PH_SetErrorMessage("Iterative method did not converge within %d iterations.\nConsider using a different numerical method or increasing the maximum number of iterations", iters); } + if (!done) { delete[] soln; soln = NULL; PH_SetErrorMessage("Iterative method did not converge within %d iterations.\nConsider using a different numerical method or increasing the maximum number of iterations", iters); } // catch exceptions: register error, free memory } catch (std::bad_alloc e) { @@ -311,7 +311,7 @@ jdouble omega // omega (over-relaxation parameter) if (diags_dist) delete diags_dist; if (b_vec) delete[] b_vec; if (b_dist) delete b_dist; - if (soln2) delete soln2; + if (soln2) delete[] soln2; return ptr_to_jlong(soln); } diff --git a/prism/src/hybrid/PH_NondetBoundedUntil.cc b/prism/src/hybrid/PH_NondetBoundedUntil.cc index cbb28fd9..04181fec 100644 --- a/prism/src/hybrid/PH_NondetBoundedUntil.cc +++ b/prism/src/hybrid/PH_NondetBoundedUntil.cc @@ -266,8 +266,8 @@ jboolean min // min or max probabilities (true = min, false = max) if (hddms) delete hddms; if (yes_vec) delete[] yes_vec; if (yes_dist) delete yes_dist; - if (soln2) delete soln2; - if (soln3) delete soln3; + if (soln2) delete[] soln2; + if (soln3) delete[] soln3; return ptr_to_jlong(soln); } diff --git a/prism/src/hybrid/PH_NondetReachReward.cc b/prism/src/hybrid/PH_NondetReachReward.cc index 77343048..58096a0f 100644 --- a/prism/src/hybrid/PH_NondetReachReward.cc +++ b/prism/src/hybrid/PH_NondetReachReward.cc @@ -320,7 +320,7 @@ jboolean min // min or max probabilities (true = min, false = max) PH_PrintToMainLog(env, "\nIterative method: %d iterations in %.2f seconds (average %.6f, setup %.2f)\n", iters, time_taken, time_for_iters/iters, time_for_setup); // if the iterative method didn't terminate, this is an error - if (!done) { delete soln; soln = NULL; PH_SetErrorMessage("Iterative method did not converge within %d iterations.\nConsider using a different numerical method or increasing the maximum number of iterations", iters); } + if (!done) { delete[] soln; soln = NULL; PH_SetErrorMessage("Iterative method did not converge within %d iterations.\nConsider using a different numerical method or increasing the maximum number of iterations", iters); } // catch exceptions: register error, free memory } catch (std::bad_alloc e) { @@ -337,8 +337,8 @@ jboolean min // min or max probabilities (true = min, false = max) if (hddms2) delete hddms2; if (rew_vec) delete[] rew_vec; if (rew_dist) delete rew_dist; - if (soln2) delete soln2; - if (soln3) delete soln3; + if (soln2) delete[] soln2; + if (soln3) delete[] soln3; return ptr_to_jlong(soln); } diff --git a/prism/src/hybrid/PH_NondetUntil.cc b/prism/src/hybrid/PH_NondetUntil.cc index 8dcf2fdb..7c0409de 100644 --- a/prism/src/hybrid/PH_NondetUntil.cc +++ b/prism/src/hybrid/PH_NondetUntil.cc @@ -271,7 +271,7 @@ jboolean min // min or max probabilities (true = min, false = max) PH_PrintToMainLog(env, "\nIterative method: %d iterations in %.2f seconds (average %.6f, setup %.2f)\n", iters, time_taken, time_for_iters/iters, time_for_setup); // if the iterative method didn't terminate, this is an error - if (!done) { delete soln; soln = NULL; PH_SetErrorMessage("Iterative method did not converge within %d iterations.\nConsider using a different numerical method or increasing the maximum number of iterations", iters); } + if (!done) { delete[] soln; soln = NULL; PH_SetErrorMessage("Iterative method did not converge within %d iterations.\nConsider using a different numerical method or increasing the maximum number of iterations", iters); } // catch exceptions: register error, free memory } catch (std::bad_alloc e) { @@ -285,8 +285,8 @@ jboolean min // min or max probabilities (true = min, false = max) if (hddms) delete hddms; if (yes_vec) delete[] yes_vec; if (yes_dist) delete yes_dist; - if (soln2) delete soln2; - if (soln3) delete soln3; + if (soln2) delete[] soln2; + if (soln3) delete[] soln3; return ptr_to_jlong(soln); } diff --git a/prism/src/hybrid/PH_PSOR.cc b/prism/src/hybrid/PH_PSOR.cc index 2094466e..fb9aaa31 100644 --- a/prism/src/hybrid/PH_PSOR.cc +++ b/prism/src/hybrid/PH_PSOR.cc @@ -344,7 +344,7 @@ jboolean forwards // forwards or backwards? PH_PrintToMainLog(env, "\n%sPseudo %s: %d iterations in %.2f seconds (average %.6f, setup %.2f)\n", forwards?"":"Backwards ", (omega == 1.0)?"Gauss-Seidel":"SOR", iters, time_taken, time_for_iters/iters, time_for_setup); // if the iterative method didn't terminate, this is an error - if (!done) { delete soln; soln = NULL; PH_SetErrorMessage("Iterative method did not converge within %d iterations.\nConsider using a different numerical method or increasing the maximum number of iterations", iters); } + if (!done) { delete[] soln; soln = NULL; PH_SetErrorMessage("Iterative method did not converge within %d iterations.\nConsider using a different numerical method or increasing the maximum number of iterations", iters); } // catch exceptions: register error, free memory } catch (std::bad_alloc e) { diff --git a/prism/src/hybrid/PH_Power.cc b/prism/src/hybrid/PH_Power.cc index 2b79a0b3..42ac719d 100644 --- a/prism/src/hybrid/PH_Power.cc +++ b/prism/src/hybrid/PH_Power.cc @@ -229,7 +229,7 @@ jboolean transpose // transpose A? (i.e. solve xA=x not Ax=x?) PH_PrintToMainLog(env, "\nPower method: %d iterations in %.2f seconds (average %.6f, setup %.2f)\n", iters, time_taken, time_for_iters/iters, time_for_setup); // if the iterative method didn't terminate, this is an error - if (!done) { delete soln; soln = NULL; PH_SetErrorMessage("Iterative method did not converge within %d iterations.\nConsider using a different numerical method or increasing the maximum number of iterations", iters); } + if (!done) { delete[] soln; soln = NULL; PH_SetErrorMessage("Iterative method did not converge within %d iterations.\nConsider using a different numerical method or increasing the maximum number of iterations", iters); } // catch exceptions: register error, free memory } catch (std::bad_alloc e) { @@ -243,7 +243,7 @@ jboolean transpose // transpose A? (i.e. solve xA=x not Ax=x?) if (hddm) delete hddm; if (b_vec) delete[] b_vec; if (b_dist) delete b_dist; - if (soln2) delete soln2; + if (soln2) delete[] soln2; return ptr_to_jlong(soln); } diff --git a/prism/src/hybrid/PH_ProbBoundedUntil.cc b/prism/src/hybrid/PH_ProbBoundedUntil.cc index dba78203..d63ac1a7 100644 --- a/prism/src/hybrid/PH_ProbBoundedUntil.cc +++ b/prism/src/hybrid/PH_ProbBoundedUntil.cc @@ -230,7 +230,7 @@ jint bound // time bound if (hddm) delete hddm; if (yes_vec) delete[] yes_vec; if (yes_dist) delete yes_dist; - if (soln2) delete soln2; + if (soln2) delete[] soln2; return ptr_to_jlong(soln); } diff --git a/prism/src/hybrid/PH_ProbCumulReward.cc b/prism/src/hybrid/PH_ProbCumulReward.cc index a0748a00..40bf8e65 100644 --- a/prism/src/hybrid/PH_ProbCumulReward.cc +++ b/prism/src/hybrid/PH_ProbCumulReward.cc @@ -225,7 +225,7 @@ jint bound // time bound if (hddm) delete hddm; if (rew_vec) delete[] rew_vec; if (rew_dist) delete rew_dist; - if (soln2) delete soln2; + if (soln2) delete[] soln2; return ptr_to_jlong(soln); } diff --git a/prism/src/hybrid/PH_ProbInstReward.cc b/prism/src/hybrid/PH_ProbInstReward.cc index 26a4a541..34bee796 100644 --- a/prism/src/hybrid/PH_ProbInstReward.cc +++ b/prism/src/hybrid/PH_ProbInstReward.cc @@ -186,7 +186,7 @@ jint bound // time bound // free memory if (hddm) delete hddm; - if (soln2) delete soln2; + if (soln2) delete[] soln2; return ptr_to_jlong(soln); } diff --git a/prism/src/hybrid/PH_ProbTransient.cc b/prism/src/hybrid/PH_ProbTransient.cc index e5f1a5fe..b6e6d85b 100644 --- a/prism/src/hybrid/PH_ProbTransient.cc +++ b/prism/src/hybrid/PH_ProbTransient.cc @@ -206,7 +206,7 @@ jint time // time // free memory if (hddm) delete hddm; - if (soln2) delete soln2; + if (soln2) delete[] soln2; return ptr_to_jlong(soln); } diff --git a/prism/src/hybrid/PH_SOR.cc b/prism/src/hybrid/PH_SOR.cc index b977d2a0..49f6cf54 100644 --- a/prism/src/hybrid/PH_SOR.cc +++ b/prism/src/hybrid/PH_SOR.cc @@ -387,7 +387,7 @@ jboolean fwds // forwards or backwards? PH_PrintToMainLog(env, "\n%s%s: %d iterations in %.2f seconds (average %.6f, setup %.2f)\n", forwards?"":"Backwards ", (omega == 1.0)?"Gauss-Seidel":"SOR", iters, time_taken, time_for_iters/iters, time_for_setup); // if the iterative method didn't terminate, this is an error - if (!done) { delete soln; soln = NULL; PH_SetErrorMessage("Iterative method did not converge within %d iterations.\nConsider using a different numerical method or increasing the maximum number of iterations", iters); } + if (!done) { delete[] soln; soln = NULL; PH_SetErrorMessage("Iterative method did not converge within %d iterations.\nConsider using a different numerical method or increasing the maximum number of iterations", iters); } // catch exceptions: register error, free memory } catch (std::bad_alloc e) {