当我尝试使用 tbb 并行我的程序时出现分段错误

get segmentation fault when I try to use tbb to parallel my program

我的程序在串行方式下运行良好,但是当我尝试使用 tbb 对其进行并行化时出现分段错误。

我是 tbb 绿色 hand.My 程序非常简单,但我不明白为什么会出错。我希望我能在这里得到一些帮助。下面是我的程序。

#include <iostream>
#include <opencv2/opencv.hpp>
#include <tbb/tbb.h>
using namespace std;
using namespace cv;
class test{
public:
    Mat * imgarr;
    test(){
        imgarr = new Mat[10];
        for(int i =0 ;i<10;i++){
            imgarr[i] = Mat::zeros(10,10,CV_64F);
        }
    }
    void add(int i) const {
        Mat& tmp = imgarr[i];
        tmp(Range(0,10),Range(0,10)) += 1;
    }
    void operator()(tbb::blocked_range<int>& r) const {
        for(int i = r.begin();i != r.end();i++){
            add(i);
        }
    }
    ~test(){
        delete[] imgarr;
    }

};
int main(){
    test a;
    tbb::parallel_for(tbb::blocked_range<int>(0,10), a);
    for(int i =0 ;i< 3;i++){
        cout << a.imgarr[0]<<endl;
    }
    return 0;
}

tbb::parallel_for 创建提供的正文对象的多个副本。由于您没有为 class test 提供任何复制构造函数,默认的复制构造函数将只复制状态,即 imgarr 指针。然后,一旦 TBB 创建的临时 test 对象被销毁,imgarr 就会被释放,您将无法再使用它。

尝试对 imgarr 使用 std::shared_ptr