首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单的协同程序与GCC 10的泄漏

简单的协同程序与GCC 10的泄漏
EN

Stack Overflow用户
提问于 2020-06-01 12:49:27
回答 1查看 1K关注 0票数 12

考虑下面这个简单的协程,它跟踪它的构造和销毁:

代码语言:javascript
复制
#include <coroutine>
#include <iostream>

struct simple {
  static inline int x = 0;
  int id = 0;
  simple() : id{ x++ } { std::cout << id << " constructed\n"; }
  simple(simple&&) : id{ x++ } { std::cout << id << " move constructed\n"; }
  ~simple() { std::cout << id << " destructed\n"; }

  struct promise_type {
    simple get_return_object() { return {}; }
    void return_void() {}
    void unhandled_exception() { std::terminate(); }
    auto initial_suspend() noexcept { return std::suspend_never{}; }
    auto final_suspend() noexcept { return std::suspend_never{}; }
  };
};

simple f() { co_return; }

int main() {
  f();
}

使用GCC 10.1编译时,输出为:

代码语言:javascript
复制
0 constructed
1 move constructed
1 destructed

-notably,id 0永远不会被销毁。这是真的,即使是在使用GCC树干的情况下。

我是不是做错了什么,隐藏的UB之类的?还是说这件事是GCC的错?

作为比较,我尝试使用Clang的实验性协程支持,并获得

代码语言:javascript
复制
0 constructed
0 destructed

这更接近于我的预期。如果我注释掉协程对象中的move构造器,我也会得到这个“正确”的输出,即使在GCC中也是如此。

现场示例:https://godbolt.org/z/UQVURi

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-03 17:25:09

正如Oliv提到的,这似乎只是一个错误,有了GCC的实验性协程支持。一张罚单已经被提出here

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62125871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档