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

C++11多线程传递引用报错及段错误问题求助

解决C++11多线程传递vector引用的编译错误与段错误问题

咱们一步步拆解你遇到的两个核心问题:

1. 编译错误的原因

你的线程函数_function_需要接收一个非const左值引用std::vector<long long>&,但直接传递results_array[i]时,std::thread的构造函数会默认尝试拷贝这个vector——临时生成的拷贝对象无法绑定到非const的左值引用,这就导致了编译器抛出的result_of相关错误。你想到用std::ref是正确的方向,但还有更致命的越界问题没解决。

2. 段错误的根源

你初始化的results_array是一个空vector,但循环里直接用results_array[i]去赋值或访问——vector::operator[]不会自动扩容,当i从1开始时,容器的size是0,访问索引1属于越界访问,触发了未定义行为,也就是你看到的段错误。

修正后的代码示例

这里提供两种可行的修正方案,核心都是先确保results_array的元素是合法可访问的:

方案一:提前扩容vector

#include <thread>
#include <vector>
#include <iostream>

void _function_(std::vector<long long>& results) { 
    results.push_back(10); 
} 

int main() {
    const int N = 5; // 替换成你实际的N值
    std::vector<std::thread> threads; 
    std::vector<std::vector<long long>> results_array;
    
    // 提前将results_array扩容到N个空vector,确保索引合法
    results_array.resize(N);
    
    // 循环从0开始(若业务需要i从1到N,可改用results_array[i-1])
    for(int i = 0; i < N; ++i) { 
        // 用std::ref传递引用,避免拷贝且满足函数参数要求
        threads.push_back(std::thread(&_function_, std::ref(results_array[i]))); 
    } 
    
    // 等待所有线程完成
    for(auto& th : threads) { 
        th.join(); 
    } 
    
    // 验证结果
    for(int i = 0; i < N; ++i) {
        for(auto val : results_array[i]) {
            std::cout << "线程 " << i << " 的计算结果: " << val << std::endl;
        }
    }
    
    return 0; 
}

方案二:循环中动态添加元素

如果不想提前固定size,也可以在每次循环时给results_array添加新元素,再用back()获取最新元素的引用:

for(int i=1;i<=N;i++){
    // 先添加一个空vector到容器中
    results_array.push_back(std::vector<long long>());
    // 用back()获取刚添加的元素的引用,再通过std::ref传递给线程
    threads.push_back(std::thread(&_function_, std::ref(results_array.back())));
}

关键修改点总结

  • 确保results_array的元素可合法访问:要么提前resize扩容,要么每次循环push_back后用back()访问。
  • 用std::ref传递引用:让线程函数直接操作results_array中的原vector,而非临时拷贝,同时满足函数的左值引用参数要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:21:50