#c #c 11 #boost
#c #c 11 #повышение
Вопрос:
Я хочу, чтобы несколько волокон работали следующим образом.
#include <boost/fiber/fiber.hpp>
#include <vector>
void printNum(int i) {
std::cout << i << std::endl;
}
void handleInts (std::vector<std::unique_ptr<int>>amp; ints) {
std::vector<boost::fibers::fiber> runningFibers;
for (autoamp; integer : ints) {
runningFibers.emplace_back(boost::fibers::fiber([amp;](){ printNum(*integer);));
}
}
int main() {
std::vector<std::unique_ptr<int>> ints;
auto firstInt = std::make_unique<int>(1);
auto secondInt = std::make_unique<int>(2);
ints.emplace_back(std::move(firstInt));
ints.emplace_back(std::move(secondInt));
handleInts(ints);
return 0;
}
Однако это вызывает некоторую утечку памяти при запуске с valgrind. Как мне сделать то, что я пытаюсь сделать здесь, но без утечек памяти. Я просмотрел документацию boost, но запутался.
Комментарии:
1. Утечки памяти — это свойства полных программ, а не фрагментов. Можете ли вы опубликовать полную программу? В идеале не вводите код,
main
поскольку в main есть причудливые статические правила жизненного цикла, которые, я не думаю, являются основой вашей проблемы.2. Хорошо, я отредактировал его, чтобы дать больше контекста. На самом деле я не использую целые числа, я использую буферы протокола, но это не так важно для моего вопроса. Я мог бы смоделировать его, если это необходимо.
3. Пока ваш пример демонстрирует утечку, это ключевая часть, чтобы другие могли взять ваш код и подтвердить его, не придумывая код, который может или не может решить вашу проблему. 🙂
4. В контексте Boost (зависимость) задокументирована проблема с valgrind, которая требует перестроения библиотеки с помощью опции с именем «valgrind= on»: boost.org/doc/libs/1_74_0/libs/context/doc/html/context/stack/… . Это возможный источник ваших ошибок?
5. О, да, это действительно может быть. Я попытаюсь выяснить, смогу ли я это сделать.