Mercurial > octave
changeset 32194:b9cabe8a9fb0
Erase std::vector elements in stack frame destructor instead of overwriting (patch #10366).
* libinterp/corefcn/stack-frame.cc (~base_value_stack_frame): Erase elements
in the destructor instead of overwriting them with temporary objects that would
be deleted immediately afterwards anyway.
author | Markus Mützel <markus.muetzel@gmx.de> |
---|---|
date | Sat, 15 Jul 2023 10:52:57 +0200 |
parents | e82a6eec8880 |
children | 9cb43336c3b3 |
files | libinterp/corefcn/stack-frame.cc |
diffstat | 1 files changed, 8 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/libinterp/corefcn/stack-frame.cc Mon Jul 10 20:24:07 2023 +0200 +++ b/libinterp/corefcn/stack-frame.cc Sat Jul 15 10:52:57 2023 +0200 @@ -1191,17 +1191,19 @@ { // The C++ standard doesn't guarantee in which order the elements of a // std::vector are destroyed. GNU libstdc++ and LLVM libc++ seem to - // destroy them in a different order. So, overwrite elements manually + // destroy them in a different order. So, erase elements manually // from first to last to be able to guarantee a destructor call order // independent of the used STL, e.g., for classdef objects. // Member dtor order is last to first. So, m_auto_vars before m_values. - for (auto& auto_var : m_auto_vars) - auto_var = octave_value (); - - for (auto& value : m_values) - value = octave_value (); + for (auto auto_vars_iter = m_auto_vars.begin (); + auto_vars_iter != m_auto_vars.end ();) + auto_vars_iter = m_auto_vars.erase (auto_vars_iter); + + for (auto values_iter = m_values.begin (); + values_iter != m_values.end ();) + values_iter = m_values.erase (values_iter); } std::size_t size () const