Код: Выделить всё
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
Код: Выделить всё
for (auto&& e : vec) {
if (myPredicate(e)) {
toProcess.push_back(std::move(e));
}
}
- Переполнение кучи ASAN
- Это происходит в конструкторе перемещения Foo, выполняемом в пределах диапазонов::to_vector
- Этот сбой не легко воспроизводится; для воспроизведения требуется непрерывная работа с векторами размеров 0–10000+, иногда до часа.
- Предположительно, один и тот же элемент перемещается дважды. Я не понимаю, как это возможно, но, похоже, это единственное объяснение здесь.
- Возможно ли это связано с тем, почему диапазоны C++ "transform -> filter" дважды вызывают преобразование для значений, соответствующих предикат фильтра?
- Теперь я понимаю, что это не правильный способ перемещения элементов и вместо этого использовать диапазоны::views::move. Однако безопасно ли здесь? Какие еще пистолеты скрываются за ходом? Каковы лучшие практики в этом отношении?
Подробнее здесь: https://stackoverflow.com/questions/787 ... code-crash