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 <simon@rozman.si>
This commit is contained in:
Simon Rozman 2022-10-28 13:45:51 +02:00
parent d4fdd62916
commit afb137edee
2 changed files with 16 additions and 0 deletions

View File

@ -98,9 +98,11 @@ void wxZRColaComposerPanel::SynchronizePanels()
// ZRCola decompose first, then re-compose. // ZRCola decompose first, then re-compose.
app->m_t_db.TranslateInv(app->m_mainWnd->m_composition_id, dst.data(), dst.size(), dst2, &map); app->m_t_db.TranslateInv(app->m_mainWnd->m_composition_id, dst.data(), dst.size(), dst2, &map);
m_mapping.push_back(std::move(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); app->m_t_db.Translate(app->m_mainWnd->m_composition_id, dst2.data(), dst2.size(), dst, &map);
m_mapping.push_back(std::move(map)); m_mapping.push_back(std::move(map));
map.clear();
} }
// Other translations // Other translations
@ -109,7 +111,9 @@ void wxZRColaComposerPanel::SynchronizePanels()
for (auto s = sets_begin; s != sets_end; ++s) { for (auto s = sets_begin; s != sets_end; ++s) {
app->m_t_db.Translate(*s, dst.data(), dst.size(), dst2, &map); app->m_t_db.Translate(*s, dst.data(), dst.size(), dst2, &map);
m_mapping.push_back(std::move(map)); m_mapping.push_back(std::move(map));
map.clear();
dst = std::move(dst2); dst = std::move(dst2);
dst2.clear();
} }
m_source->GetSelection(&m_selSource.first, &m_selSource.second); m_source->GetSelection(&m_selSource.first, &m_selSource.second);
@ -144,18 +148,22 @@ void wxZRColaComposerPanel::SynchronizePanels()
for (auto s = sets_end; (s--) != sets_begin;) { for (auto s = sets_end; (s--) != sets_begin;) {
app->m_t_db.TranslateInv(*s, dst.data(), dst.size(), dst2, &map); app->m_t_db.TranslateInv(*s, dst.data(), dst.size(), dst2, &map);
dst = std::move(dst2); dst = std::move(dst2);
dst2.clear();
map.invert(); map.invert();
m_mapping.push_back(std::move(map)); m_mapping.push_back(std::move(map));
map.clear();
} }
if (app->m_mainWnd->m_composition) { if (app->m_mainWnd->m_composition) {
// ZRCola decompose. // 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); 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); dst = std::move(dst2);
dst2.clear();
map.invert(); map.invert();
m_mapping.push_back(std::move(map)); m_mapping.push_back(std::move(map));
map.clear();
} }
m_destination->GetSelection(&m_selDestination.first, &m_selDestination.second); m_destination->GetSelection(&m_selDestination.first, &m_selDestination.second);

View File

@ -132,14 +132,18 @@ public:
// Decompose first, then re-compose. // Decompose first, then re-compose.
t_db.TranslateInv(*ts, dst.data(), dst.size(), dst2, &map); t_db.TranslateInv(*ts, dst.data(), dst.size(), dst2, &map);
mapping.push_back(std::move(map)); mapping.push_back(std::move(map));
map.clear();
t_db.Translate(*ts, dst2.data(), dst2.size(), dst, &map); t_db.Translate(*ts, dst2.data(), dst2.size(), dst, &map);
mapping.push_back(std::move(map)); mapping.push_back(std::move(map));
map.clear();
break; break;
default: default:
t_db.Translate(*ts, dst.data(), dst.size(), dst2, &map); t_db.Translate(*ts, dst.data(), dst.size(), dst2, &map);
mapping.push_back(std::move(map)); mapping.push_back(std::move(map));
map.clear();
dst = std::move(dst2); dst = std::move(dst2);
dst2.clear();
} }
} }
} }
@ -199,15 +203,19 @@ public:
case ZRCOLA_TRANSETID_UNICODE: case ZRCOLA_TRANSETID_UNICODE:
t_db.TranslateInv(*ts, dst.data(), dst.size(), &lc_db, lang, dst2, &map); t_db.TranslateInv(*ts, dst.data(), dst.size(), &lc_db, lang, dst2, &map);
dst = std::move(dst2); dst = std::move(dst2);
dst2.clear();
map.invert(); map.invert();
mapping.push_back(std::move(map)); mapping.push_back(std::move(map));
map.clear();
break; break;
default: default:
t_db.TranslateInv(*ts, dst.data(), dst.size(), dst2, &map); t_db.TranslateInv(*ts, dst.data(), dst.size(), dst2, &map);
dst = std::move(dst2); dst = std::move(dst2);
dst2.clear();
map.invert(); map.invert();
mapping.push_back(std::move(map)); mapping.push_back(std::move(map));
map.clear();
} }
} }
} }