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