谢谢! 我目前的理解是:
task foo() {
co_return;
}
task bar() {
co_await foo();
}
foo()函数的co_return在foo()的final_suspend这个切换点直接切换到了bar()的执行栈并开始执行.
bar()开始执行后, 当运行完co_wait这一行后,调用foo()返回的task对象的析构函数.
这个析构函数释放了foo()的协程frame和promise对象.
但是当foo()切换回bar()时候,并没有清理栈上foo()的调用frame.
然后当bar()函数析构掉foo()返回的task对象后,这个调用frame就遗漏在栈上了.
直到bar()结束,切换到它的caller,才会将这个遗漏的调用帧忽略.
如果不能及时忽略,比如for-loop的方式调用foo(), 就会爆栈.
如果这样的话这是重大缺陷啊? 这种栈溢出不难复现, 任何协程调用协程都可能出现.
设计coroutine这些大佬们没有一开始就敏锐的发现这里会爆栈吗?
【 在 ziqin 的大作中提到: 】
: co_return和return的区别
: co_return本身还带一个co_wait,导致栈没有被清理
:
https://lewissbaker.github.io/2018/09/05/understanding-the-promise-type: ...................
--
FROM 158.140.1.*