for (auto&& e : vec) {
if (myPredicate(e)) {
toProcess.push_back(std::move(e));
}
}
Некоторые подробности об аварии:
Переполнение кучи ASAN
Это происходит в конструкторе перемещения Foo, выполняемом в пределах диапазонов::to_vector
Этот сбой не легко воспроизводится; для воспроизведения требуется непрерывная работа с векторами размеров 0–10000+, иногда до часа.
Предположительно, один и тот же элемент перемещается дважды. Я не понимаю, как это возможно, но, похоже, это единственное объяснение здесь.
Возможно ли это связано с тем, почему диапазоны C++ "transform -> filter" дважды вызывают преобразование для значений, соответствующих предикат фильтра?
Дополнительные вопросы:
Теперь я понимаю, что это не правильный способ перемещения элементов и вместо этого использовать диапазоны::views::move. Однако безопасно ли здесь? Какие еще пистолеты скрываются за ходом? Каковы лучшие практики в этом отношении?
Я использую Range-v3 примерно так: [code]std::vector vec = co_await scanFoo(); auto toProcess = vec | views::filter([&](auto&& e){ return myPredicate(e); }) | views::transform([](auto&& e) { return std::move(e); }) | ranges::to_vector [/code] Одна и та же логика, написанная итеративно, не воспроизводит сбой: [code]for (auto&& e : vec) { if (myPredicate(e)) { toProcess.push_back(std::move(e)); } } [/code] Некоторые подробности об аварии: [list] [*]Переполнение кучи ASAN [*]Это происходит в конструкторе перемещения Foo, выполняемом в пределах диапазонов::to_vector [*]Этот сбой [b]не[/b] легко воспроизводится; для воспроизведения требуется непрерывная работа с векторами размеров 0–10000+, иногда до часа. [*]Предположительно, один и тот же элемент перемещается дважды. Я не понимаю, как это возможно, но, похоже, это единственное объяснение здесь. [*]Возможно ли это связано с тем, почему диапазоны C++ "transform -> filter" дважды вызывают преобразование для значений, соответствующих предикат фильтра? [/list] Дополнительные вопросы: [list] [*]Теперь я понимаю, что это [b]не[/b] правильный способ перемещения элементов и вместо этого использовать диапазоны::views::move. Однако безопасно ли здесь? Какие еще пистолеты скрываются за ходом? Каковы лучшие практики в этом отношении? [/list]