gpt4 book ai didi

c++ - 通过指向在另一个线程上执行的函数的指针传递堆栈分配的对象

转载 作者:行者123 更新时间:2023-11-30 00:46:19 24 4
gpt4 key购买 nike

据我所知,线程共享堆内存但有自己的堆栈。因此,如果我通过指针(出于多态原因)将堆栈分配的对象传递给在另一个线程上执行的函数,这是否安全,或者我会得到未定义的行为。例如这段代码:

struct Foo{
int counter{0};
}

void bar(Foo * obj){
obj->counter++;
}
int main(){
{
Foo foo_object;
std::thread t(bar, &foo_object);
t.detach();
}
//do more stuff
}

这是不安全的,因为在 foo_object 超出范围后,指向 foo_object 的指针将无效,但线程可以访问无效内存?我有一种强烈的感觉,这会产生未定义的行为,但我不是 100% 确定。

最佳答案

不,这不安全。一旦你到达

{
Foo foo_object();
std::thread t(bar, &foo_object);
t.detach();
}

foo_object 将超出范围,您将在分离的线程中留下一个悬空指针。由于我们不知道线程何时真正启动,因此完全有可能基于堆栈的本地对象在您使用它时已经被销毁。


另请注意,Foo foo_object(); 是函数声明而不是局部变量。要拥有一个变量,您需要 Foo foo_object;

关于c++ - 通过指向在另一个线程上执行的函数的指针传递堆栈分配的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38960013/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com