Seg 由对 vector (线程 linux) push_back调用而导致的错误

Seg Fault resulting from push_back call on vector (threads linux)

本文关键字:调用 back 错误 push vector 由对 线程 linux Seg      更新时间:2023-10-16

所以我要做的是编写一个程序来创建一系列子线程,这些子线程使用 pthread_create 方法获取参数,并使用传入的参数进行更多操作等等。我尝试传入的参数是一个名为 reduce_args_ 的向量参数。这是结构 ReduceVector 的标头信息。

typedef vector<string> StringVector;
// a data structure to maintain info for the reduce task
struct ReduceArg
{
  ReduceArg (void);  // constructor
  ~ReduceArg (void); // destructor
  pthread_t tid;  // thread id of the reduce thread
  StringVector files_to_reduce; // set of files for reduce task
};
// more typedefs
typedef vector<ReduceArg *> ReduceVector;

现在,当我在这里打电话给push_back时,问题就来了:

for(int i = 0; i < num_reduce_threads_ ; i++){
            reduce_args_.push_back(phold);
        int count = 0;
        for(ShuffleSet::iterator it = shuffle_set_.begin(); it!=shuffle_set_.end(); ++it){
            string line = *it;
            string space = " ";
            string file = line.substr(0, line.find(space)) + ".txt";
            if (count < num_reduce_threads_){
                cout << reduce_args_[i+1];
                (reduce_args_[i+1] -> files_to_reduce)[count] = file;
                            //(reduce_args_[i+1] -> files_to_reduce).push_back(file);
             }
             count++;
            //cout << ((reduce_args_.back())->files_to_reduce).back()<< endl;
    }
}

这两种push_back方法都会导致 SEG 错误。 洗牌集只是一个集合,正在输出字符串。 如 .h 文件中所述,files_to_reduce是一个字符串向量。所以我要做的是访问files_to_reduce并在上面push_back一个字符串,但每次我都得到一个 seg 错误。reduce_args_ obj 声明如下:

ReduceArg* plhold;
    reduce_args_.push_back(plhold);
    ((reduce_args_.back()) -> files_to_reduce).push_back("hello");
    for (int i = 0; i < this->num_reduce_threads_; ++i) {
      // create a placeholder reduce argument and store it in our vector
      (reduce_args_.push_back(plhold));
    }

感谢您的帮助!!

这个:

ReduceArg* plhold;
reduce_args_.push_back(plhold);

除非你隐藏了一些重要的代码,否则你正在推送一个未初始化的指针,所以下一行会导致混乱。

可能你的意思是这个?

ReduceArg* plhold(new ReduceArg);

..但我怀疑您没有正确考虑其地址存储在向量中的对象的生存期和所有权。

一般来说,除非你确切地知道你在做什么,以及为什么,否则避免使用指针。发布的代码不需要它们,我建议您使用这样的东西:

typedef vector<ReduceArg> ReduceVector;
....
reduce_args_.push_back(ReduceArg());
reduce_args_.back().files_to_reduce.push_back("hello");
for (int i = 0; i < num_reduce_threads_; ++i) {
  // create a placeholder reduce argument and store it in our vector
  (reduce_args_.push_back(ReduceArg());
}