小编use*_*534的帖子

co_yield 指向局部协程变量的指针是否不安全?

众所周知,返回指向堆栈变量的指针通常是一个坏主意:

int* foo() {
  int i = 0;
  return &i;
}

int main() {
  int* p = foo();
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我的理解是 被int破坏了,p悬空指针也被破坏了。

我想知道这在多大程度上适用于 C++20 新引入的协程:

generator<span<byte>> read(stream& s) {
  array<byte, 4096> b;
  while (s.is_open()) {
    const size_t n = s.read_some(b);
    co_yield span(b, n);
  }
}

int main() {
  stream s;
  for (span<byte> v : read(s)) {
    /* ... */
  }
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,read协程生成span本地缓冲区的视图b。在内部,该视图存储一个指向缓冲区的指针。v当与范围循环体一起使用时,该指针是否会悬空for

对于上下文,第二个示例中的协程代码是根据我自己的项目中的代码建模的。在那里,AddressSanitizer 以“释放后使用”错误结束程序。通常我认为这足以回答我的问题,但由于此时协程开发仍在进行中(我的项目正在使用boost::asio::experimental::coro,强调“实验”),我想知道该错误是否是由以下错误引起的generator …

c++ coroutine dangling-pointer c++20 c++-coroutine

10
推荐指数
1
解决办法
244
查看次数

标签 统计

c++ ×1

c++-coroutine ×1

c++20 ×1

coroutine ×1

dangling-pointer ×1