diff options
author | 2011-02-07 19:52:16 +0100 | |
---|---|---|
committer | 2011-02-07 19:52:16 +0100 | |
commit | 40526e24b44181e78da09d70bc300a74733a1bee (patch) | |
tree | 9d6817167bf7359a7123ea8207d8ddb65e5055ab /Eigen/src | |
parent | ba9f6a2c3b8e775f2e49eaead6fac9ba21a1ced8 (diff) |
fix memory leak (when conservatively resizing vectors of dynamically allocated scalar types such as bugnums)
Diffstat (limited to 'Eigen/src')
-rw-r--r-- | Eigen/src/Core/util/Memory.h | 8 |
1 files changed, 6 insertions, 2 deletions
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<typename T, bool Align> inline void conditional_aligned_delete(T *ptr, template<typename T, bool Align> 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<T*>(conditional_aligned_realloc<Align>(reinterpret_cast<void*>(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<typename T, bool Align> inline T* conditional_aligned_new_auto(size_t s template<typename T, bool Align> inline T* conditional_aligned_realloc_new_auto(T* pts, size_t new_size, size_t old_size) { + if(NumTraits<T>::RequireInitialization && (new_size < old_size)) + destruct_elements_of_array(pts+new_size, old_size-new_size); T *result = reinterpret_cast<T*>(conditional_aligned_realloc<Align>(reinterpret_cast<void*>(pts), sizeof(T)*new_size, sizeof(T)*old_size)); - if (NumTraits<T>::RequireInitialization && (new_size > old_size)) + if(NumTraits<T>::RequireInitialization && (new_size > old_size)) construct_elements_of_array(result+old_size, new_size-old_size); return result; } |