众所周知,返回指向堆栈变量的指针通常是一个坏主意:
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 …