局部变量传入thrd_create是否会产生悬空指针?执行顺序解析
线程参数的悬空指针问题分析
代码示例
int foo(void* arg) { int v = *(int*)arg; // arg是否可能是悬空指针? } thrd_t t; int bar() { int my_variable = 42; int ret = thrd_create(&t,foo,&my_variable); return ret; }
执行顺序与悬空指针风险分析
bar函数里的my_variable是栈上的局部变量,它的生命周期只在bar函数执行期间。- 调用
thrd_create创建新线程后,该函数会直接返回,bar随即执行完毕退出,此时栈上的my_variable会被销毁,对应的内存空间被系统回收。 - 新线程的
foo函数是异步执行的,它的执行时机不受bar控制:- 有可能
bar还没退出时,foo就完成了对arg的解引用,这时不会出问题; - 但也完全有可能
bar已经退出、my_variable内存已被释放后,foo才开始解引用arg,这时arg就变成了悬空指针,访问该指针指向的内存属于C标准中的未定义行为,可能导致程序崩溃、数据错乱等不可预料的结果。
- 有可能
结论:foo中的arg确实存在成为悬空指针的可能性,问题根源在于创建线程后未等待线程完成(未调用thrd_join)就让持有局部变量的函数退出,导致局部变量生命周期提前结束。
内容的提问来源于stack exchange,提问作者user3001150
相关产品推荐
相关产品推荐

