From 40526e24b44181e78da09d70bc300a74733a1bee Mon Sep 17 00:00:00 2001 From: Gael Guennebaud Date: Mon, 7 Feb 2011 19:52:16 +0100 Subject: fix memory leak (when conservatively resizing vectors of dynamically allocated scalar types such as bugnums) --- Eigen/src/Core/util/Memory.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'Eigen/src') diff --git a/Eigen/src/Core/util/Memory.h b/Eigen/src/Core/util/Memory.h index 558486418..8881cefad 100644 --- a/Eigen/src/Core/util/Memory.h +++ b/Eigen/src/Core/util/Memory.h @@ -363,8 +363,10 @@ template inline void conditional_aligned_delete(T *ptr, template inline T* conditional_aligned_realloc_new(T* pts, size_t new_size, size_t old_size) { + if(new_size < old_size) + destruct_elements_of_array(pts+new_size, old_size-new_size); T *result = reinterpret_cast(conditional_aligned_realloc(reinterpret_cast(pts), sizeof(T)*new_size, sizeof(T)*old_size)); - if (new_size > old_size) + if(new_size > old_size) construct_elements_of_array(result+old_size, new_size-old_size); return result; } @@ -380,8 +382,10 @@ template inline T* conditional_aligned_new_auto(size_t s template inline T* conditional_aligned_realloc_new_auto(T* pts, size_t new_size, size_t old_size) { + if(NumTraits::RequireInitialization && (new_size < old_size)) + destruct_elements_of_array(pts+new_size, old_size-new_size); T *result = reinterpret_cast(conditional_aligned_realloc(reinterpret_cast(pts), sizeof(T)*new_size, sizeof(T)*old_size)); - if (NumTraits::RequireInitialization && (new_size > old_size)) + if(NumTraits::RequireInitialization && (new_size > old_size)) construct_elements_of_array(result+old_size, new_size-old_size); return result; } -- cgit v1.2.3