From b7872f4ba838fe8839f046b56a11498f80cbd256 Mon Sep 17 00:00:00 2001 From: Jonathan Rouzaud-Cornabas <jonathan.rouzaud-cornabas@inria.fr> Date: Wed, 21 Feb 2018 11:03:13 +0100 Subject: [PATCH] no segfault at exit --- src/libaevol/ExpManager.cpp | 2 +- src/libaevol/SIMD_Individual.cpp | 25 ++++++++++++++++++++----- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/libaevol/ExpManager.cpp b/src/libaevol/ExpManager.cpp index 296c85812..32a367956 100644 --- a/src/libaevol/ExpManager.cpp +++ b/src/libaevol/ExpManager.cpp @@ -119,10 +119,10 @@ ExpManager::ExpManager() // =========================================================================== ExpManager::~ExpManager() noexcept { + delete simd_individual; delete exp_s_; delete output_m_; delete world_; - delete simd_individual; } // =========================================================================== diff --git a/src/libaevol/SIMD_Individual.cpp b/src/libaevol/SIMD_Individual.cpp index cd5861d84..dbe213751 100644 --- a/src/libaevol/SIMD_Individual.cpp +++ b/src/libaevol/SIMD_Individual.cpp @@ -284,12 +284,27 @@ void SIMD_Individual::do_mutation() { SIMD_Individual::~SIMD_Individual() { for (int indiv_id = 0; indiv_id < (int) exp_m_->nb_indivs(); indiv_id++) { - internal_simd_struct[indiv_id]->rnas.clear(); - internal_simd_struct[indiv_id]->proteins.clear(); - delete internal_simd_struct[indiv_id]->dna_; + if (internal_simd_struct[indiv_id] != nullptr) { + internal_simd_struct[indiv_id]->rnas.clear(); + internal_simd_struct[indiv_id]->proteins.clear(); + + if (internal_simd_struct[indiv_id]->usage_count_ > 1) + internal_simd_struct[indiv_id]->usage_count_--; + else { + delete internal_simd_struct[indiv_id]; + internal_simd_struct[indiv_id] = nullptr; + } + } + + if (prev_internal_simd_struct[indiv_id] != nullptr) { + if (prev_internal_simd_struct[indiv_id]->usage_count_ > 1) + prev_internal_simd_struct[indiv_id]->usage_count_--; + else { + delete prev_internal_simd_struct[indiv_id]; + prev_internal_simd_struct[indiv_id] = nullptr; + } + } - delete internal_simd_struct[indiv_id]; - delete prev_internal_simd_struct[indiv_id]; } delete[] prev_internal_simd_struct; -- GitLab