You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

局部变量传入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 02:22:01