From afb137edeec818b3eb2bd9e0b096f07b13a58848 Mon Sep 17 00:00:00 2001 From: Simon Rozman Date: Fri, 28 Oct 2022 13:45:51 +0200 Subject: [PATCH] Explicitly clear reused std::vector and u16string after moved from MSVC C26800 warned us std::vector and std::string are not guaranteed to be cleared after being moved from in all standard C++ implementations. As we reuse those objects and rely they are cleared, do an explicit clear. We could have one-time-use objects and add scopes, but that makes code ugly. Reference: https://stackoverflow.com/a/17735913/2071884 Signed-off-by: Simon Rozman --- ZRCola/zrcolacomppnl.cpp | 8 ++++++++ ZRColaWS/controller.hpp | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/ZRCola/zrcolacomppnl.cpp b/ZRCola/zrcolacomppnl.cpp index f78fefa..4baf946 100644 --- a/ZRCola/zrcolacomppnl.cpp +++ b/ZRCola/zrcolacomppnl.cpp @@ -98,9 +98,11 @@ void wxZRColaComposerPanel::SynchronizePanels() // ZRCola decompose first, then re-compose. app->m_t_db.TranslateInv(app->m_mainWnd->m_composition_id, dst.data(), dst.size(), dst2, &map); m_mapping.push_back(std::move(map)); + map.clear(); app->m_t_db.Translate(app->m_mainWnd->m_composition_id, dst2.data(), dst2.size(), dst, &map); m_mapping.push_back(std::move(map)); + map.clear(); } // Other translations @@ -109,7 +111,9 @@ void wxZRColaComposerPanel::SynchronizePanels() for (auto s = sets_begin; s != sets_end; ++s) { app->m_t_db.Translate(*s, dst.data(), dst.size(), dst2, &map); m_mapping.push_back(std::move(map)); + map.clear(); dst = std::move(dst2); + dst2.clear(); } m_source->GetSelection(&m_selSource.first, &m_selSource.second); @@ -144,18 +148,22 @@ void wxZRColaComposerPanel::SynchronizePanels() for (auto s = sets_end; (s--) != sets_begin;) { app->m_t_db.TranslateInv(*s, dst.data(), dst.size(), dst2, &map); dst = std::move(dst2); + dst2.clear(); map.invert(); m_mapping.push_back(std::move(map)); + map.clear(); } if (app->m_mainWnd->m_composition) { // ZRCola decompose. app->m_t_db.TranslateInv(app->m_mainWnd->m_composition_id, dst.data(), dst.size(), &app->m_lc_db, app->m_mainWnd->m_settings->m_lang, dst2, &map); dst = std::move(dst2); + dst2.clear(); map.invert(); m_mapping.push_back(std::move(map)); + map.clear(); } m_destination->GetSelection(&m_selDestination.first, &m_selDestination.second); diff --git a/ZRColaWS/controller.hpp b/ZRColaWS/controller.hpp index 4b93479..4384bd8 100644 --- a/ZRColaWS/controller.hpp +++ b/ZRColaWS/controller.hpp @@ -132,14 +132,18 @@ public: // Decompose first, then re-compose. t_db.TranslateInv(*ts, dst.data(), dst.size(), dst2, &map); mapping.push_back(std::move(map)); + map.clear(); t_db.Translate(*ts, dst2.data(), dst2.size(), dst, &map); mapping.push_back(std::move(map)); + map.clear(); break; default: t_db.Translate(*ts, dst.data(), dst.size(), dst2, &map); mapping.push_back(std::move(map)); + map.clear(); dst = std::move(dst2); + dst2.clear(); } } } @@ -199,15 +203,19 @@ public: case ZRCOLA_TRANSETID_UNICODE: t_db.TranslateInv(*ts, dst.data(), dst.size(), &lc_db, lang, dst2, &map); dst = std::move(dst2); + dst2.clear(); map.invert(); mapping.push_back(std::move(map)); + map.clear(); break; default: t_db.TranslateInv(*ts, dst.data(), dst.size(), dst2, &map); dst = std::move(dst2); + dst2.clear(); map.invert(); mapping.push_back(std::move(map)); + map.clear(); } } }