aboutsummaryrefslogtreecommitdiffhomepage
path: root/Eigen/src
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2011-02-07 19:52:16 +0100
committerGravatar Gael Guennebaud <g.gael@free.fr>2011-02-07 19:52:16 +0100
commit40526e24b44181e78da09d70bc300a74733a1bee (patch)
tree9d6817167bf7359a7123ea8207d8ddb65e5055ab /Eigen/src
parentba9f6a2c3b8e775f2e49eaead6fac9ba21a1ced8 (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.h8
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;
}