co_reutrn之后协程帧是否自动销毁并释放(即释放分配的帧?)?

问题描述 投票:0回答:1

我知道如果达到 co_return (隐式或显式) 称为

co_await promise.final_suspend()
。 在final_suspend()中,我们可以明确地调用handle.destroy(),据我了解,它会破坏协程帧(CF)中的所有对象,最后调用~promise_type(),然后释放分配的CF。请参阅下面刘易斯·贝克 (Lewis Baker) 的推荐。

但是:

  1. 如果final_suspend()不调用handle.destroy()或返回std::suspend_never或,CF会在之后立即被正确销毁吗

    co_await promise.final_suspend()
    完成了吗?

  2. 如果 Final_Suspend() 返回 std::Suspend_always 会发生什么?

  3. 释放 CF 是否以某种方式与编译器推导的 ~promise_type() 析构函数相关?

*Lewis Baker 在此推荐:https://lewissbaker.github.io/2018/09/05/understanding-the-promise-type

请注意,虽然允许协程不在 Final_Suspend 点挂起,但建议您构建协程,以便它们尽可能在 Final_Suspend 挂起。这是因为这迫使您从协程外部(通常来自某些 RAII 对象析构函数)调用协程上的 .destroy() ,这使得编译器更容易确定协程框架的生命周期范围何时结束嵌套在调用者内部。 这反过来又使得编译器更有可能省略协程框架的内存分配。

另外,阅读下面这个博客的评论让我想知道是否使用 std::suspend_neverguarantees 不会发生泄漏:

https://dev.to/atimin/the-simplest-example-of-coroutines-in-c20-4l7a

c++ memory-leaks c++20 c++-coroutine
1个回答
0
投票
  1. 是的。请参阅

    [dcl.fct.def.coroutine]/11:“当控制从协程末尾或协程句柄的 destroy

     成员函数 ([coroutine.handle.reduction]) 流出时,协程状态将被破坏引用协程的 ([coroutine.handle]) 被调用 [...]"

  2. 协程在最终挂起点挂起,控制流返回到调用协程或最近恢复它的函数,就像协程挂起的任何其他情况一样。

  3. 没有。 Promise 对象的析构函数的调用只是协程框架销毁过程中发生的步骤之一。这是因为 Promise 对象是脱糖协程中的局部变量 (

    [dcl.fct.def.coroutine]/5)。

另外,阅读下面这个博客的评论让我想知道使用

std::suspend_never

是否可以保证不存在泄漏

它可以防止一种特定类型的内存泄漏,

,即在协程在最终挂起点挂起后忘记显式销毁协程的情况。

© www.soinside.com 2019 - 2024. All rights reserved.