Код: Выделить всё
co_await promise.final_suspend()
В Final_suspend() можно определенно вызвать ``handle.destroy(), который, насколько я понимаю, уничтожает все объекты в кадре сопрограммы (CF), наконец, вызывает ~promise_type (), то он освобождает выделенный CF. См. ниже Льюис Бейкер рекомендует это.
Однако:
- Если Final_suspend() делает это не вызывать handle.destroy() или возвращает std::suspend_never или , будет ли CF правильно уничтожен сразу после
завершается?
Код: Выделить всё
co_await promise.final_suspend()
- Что произойдет, если Final_suspend() вернет std::suspend_always? p>
Освобождение CF каким-то образом связано с деструктором, выведенным компилятором ~promise_type() ?
Обратите внимание, что, хотя это разрешено сопрограмма не приостанавливается в точке Final_suspend, рекомендуется структурировать свои сопрограммы так, чтобы они приостанавливались в точке Final_suspend, где это возможно. Это связано с тем, что это заставляет вас вызывать .destroy() в сопрограмме из-за пределов сопрограммы (обычно из какого-либо деструктора объекта RAII), и это значительно упрощает компилятору определение того, когда истекает время жизни сопрограммы. кадр сопрограммы вложен в вызывающую программу. Это, в свою очередь, значительно повышает вероятность того, что компилятор сможет обойти выделение памяти для кадра сопрограммы.
Кроме того, прочитав комментарии к этому блогу ниже[1], я задался вопросом, гарантирует ли использование std::suspend_never отсутствие утечек.
1
Подробнее здесь: https://stackoverflow.com/questions/784 ... ame-is-fre