我知道如果达到 co_return (隐式或显式) 称为
co_await promise.final_suspend()
。
在final_suspend()中,我们可以明确地调用handle.destroy(),据我了解,它会破坏协程帧(CF)中的所有对象,最后调用~promise_type(),然后释放分配的CF。请参阅下面刘易斯·贝克 (Lewis Baker) 的推荐。
但是:
如果final_suspend()不调用handle.destroy()或返回std::suspend_never或,CF会在之后立即被正确销毁吗
co_await promise.final_suspend()
完成了吗?
如果 Final_Suspend() 返回 std::Suspend_always 会发生什么?
释放 CF 是否以某种方式与编译器推导的 ~promise_type() 析构函数相关?
*Lewis Baker 在此推荐:https://lewissbaker.github.io/2018/09/05/understanding-the-promise-type
另外,阅读下面这个博客的评论让我想知道是否使用 std::suspend_neverguarantees 不会发生泄漏:请注意,虽然允许协程不在 Final_Suspend 点挂起,但建议您构建协程,以便它们尽可能在 Final_Suspend 挂起。这是因为这迫使您从协程外部(通常来自某些 RAII 对象析构函数)调用协程上的 .destroy() ,这使得编译器更容易确定协程框架的生命周期范围何时结束嵌套在调用者内部。 这反过来又使得编译器更有可能省略协程框架的内存分配。
https://dev.to/atimin/the-simplest-example-of-coroutines-in-c20-4l7a
[dcl.fct.def.coroutine]/11:“当控制从协程末尾或协程句柄的 destroy
成员函数 ([coroutine.handle.reduction]) 流出时,协程状态将被破坏引用协程的 ([coroutine.handle]) 被调用 [...]"。
[dcl.fct.def.coroutine]/5)。
另外,阅读下面这个博客的评论让我想知道使用它可以防止一种特定类型的内存泄漏,
std::suspend_never
是否可以保证不存在泄漏
即,即在协程在最终挂起点挂起后忘记显式销毁协程的情况。