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

向C++线程函数传递参数时,类型转换何时执行?

C++线程参数转换时机的问题解析

核心结论

char*到std::string的转换是在新线程被操作系统调度执行时,才在新线程的上下文中完成的,而非主线程构造std::thread对象的阶段。

具体过程拆解

  • 构造std::thread t(f,3,buffer)时,线程库仅会把buffer对应的char指针复制到线程内部的存储区域,不会立即执行char到std::string的转换。
  • 只有当操作系统调度该新线程开始运行后,线程库才会在新线程的执行栈上,用之前复制的char*指针构造std::string参数,随后才会调用目标函数f。

为什么会触发未定义行为

主线程的oops函数可能在新线程完成std::string构造前就执行完毕,此时局部数组buffer会被销毁,新线程拿着已失效的char*指针去构造std::string,直接导致未定义行为。

修复方案

  • 提前在主线程中完成转换:将代码改为std::thread t(f,3,std::string(buffer));,这样复制到线程存储的是已构造好的std::string对象,不再依赖局部变量buffer的生命周期。

内容的提问来源于stack exchange,提问作者SICSU

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 07:25:19