diff --git a/src/libaevol/ExpManager.cpp b/src/libaevol/ExpManager.cpp index 296c858126100615c8f221796c0413b559d96861..32a3679560b91aa62b751a3e2f2508ae55019a00 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 cd5861d842caac7aab477c46ed6c03dcfe5ca968..dbe213751f0c83c7ef955d9e0efcd9bec84a903c 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;