C++将thread存入vector后出现字符串损坏问题如何解决?
问题根因
你遇到的字符串损坏是悬垂指针导致的:
- 循环内的
command是局部std::string对象,每轮循环迭代结束后就会被销毁 - 你向线程构造函数传递的
command.c_str()是指向该局部字符串内存的裸指针,线程实际启动时,对应的command大概率已经被销毁或者被下一轮迭代的内容覆盖,访问非法内存就会出现字符串乱码、损坏的问题
修复方案
最简单的处理方式是让线程持有command的拷贝,避免访问已经销毁的内存,你可以改用lambda按值捕获command再传入线程:
把原来的threads.push_back(thread(exec, command.c_str()));替换为以下代码:
threads.emplace_back([command]() { exec(command.c_str()); });
lambda按值捕获会生成一份command的拷贝,生命周期和lambda绑定,线程执行期间这份拷贝会一直存在,不会出现悬垂指针的问题。
额外注意点
- 你现在的
exec函数有返回值,但当前线程写法会直接丢弃返回值,如果需要获取命令执行结果,可以改用std::async配合std::future接收返回值 - 循环中直接访问
genData[i+1]、genData[i+2]没有边界校验,建议把循环条件修改为for (int i = 0; i + 2 < genData.size(); i += 3),避免数组越界崩溃,同时也可以去掉现在的i%3 !=0的continue判断,写法更简洁。
内容的提问来源于stack exchange,提问作者RealFidelCastro
相关产品推荐
相关产品推荐

