value; };
boost::asio::awaitable<void> f(bar by_value) { co_return; }
// где-то далее
co_await f(bar{ std::make_unique<int>(5) }); // double free
Баг в коде или в компиляторе? Использую gcc-10.2, получаю double free в деструкторе unique_ptr. При этом:
1. С той же версией компилятора и флагами сборки на godbolt не воспроизводится :(
2. Если bar сделать локальной переменной, а только потом мувнуть в f - всё будет ок.
3. Воспроизводится и для std::string вместо std::unique_ptr.
Полный пример: https://godbolt.org/z/479YWKjbz
При этом код после компиляции очень похож на bar temp{ .value = std::make_unique<int>(5); auto result = f(copy_not_move(temp)); // здесь вызывается деструктор temp, который был ранее побитово скопирован (!) в f
на годболте даблфри не покажет во время запуска?
godbolt показывает, что программа отработала корректно
А почему у awaitable есть promise_type?
А ты пробовал как либо запретить аргументу шаблона у f выводится в ссылку?
Там нет ссылок. Шаблон можно убрать (сейчас уберу, чтобы не смущал), эффект прежний.
Хотя да, обычные правила вывода типа
воспроизводится только с другим компилятором https://godbolt.org/z/33x16M3s1
Спасибо! Но всё же остаётся загадкой, почему на моём gcc-10.2 и на годболтовском разные результаты. При этом на github actions тоже воспроизводится..
template <class T> boost::asio::awaitable<void> f(T&& by_value) { co_return; } boost::asio::awaitable<void> g() { auto val = bar{ std::make_unique<int>(5) }; co_await f(std::move(val)); // bug } вот так правильно
правильно = не воспроизводится?
да, я об этом упомянул в изначальном посте если сделать локальную переменную - всё ок если убрать агрегатную инициализацию - тоже
Обсуждают сегодня