push_back期间的分段错误

时间:2014-05-26 00:48:18

标签: c++ segmentation-fault stdvector push-back

我在以下循环中遇到了一个非常奇怪的分段错误。 目标是让每个处理器对x / y点进行一些检查,这些检查存储在以下向量

只是为了澄清:这是一个多处理器代码而不是多线程。这就是我获得排名的方式:

 int my_rank = Utilities::MPI::this_mpi_process(mpi_communicator); 

 std::vector<std::vector<double> > Xcoord(n_proc);
 std::vector<std::vector<double> > Ycoord(n_proc);

Xcoord [i]是来自i处理器的x坐标向量,当前处理器会对它们进行一些检查,我不在下面对它们进行检查:

代码循环遍历n个处理器,首先检查它是否有关于关节点的任何信息,如果是,则保存点的id和处理器的id。

std::vector<std::vector<int> > which_point(n_proc);
std::vector<std::vector<int> > which_proc(n_proc);
for (int i = 0; i < n_proc; ++i){
     if (i == my_rank) continue;
     for (unsigned int j = 0; j < Xcoord[i].size(); ++j){
         bool yit = getYiterator(yxmap, Ycoord[i][j], itY);
         if (yit){
              bool xit = getXiterator(itY->second, Xcoord[i][j], itX);
              if (xit){
                    itZ = itX->second.zmap.begin();
                    for (; itZ != itX->second.zmap.end(); ++itZ){
                        which_point[my_rank].push_back(j);
                        which_proc[my_rank].push_back(i);
                    }
              }
         }
    } 
}

(在最里面的循环中,itX-&gt; second.zmap.size()是3)

当我在一个处理器中运行代码时,一切正常。

当我使用4个处理器时,我遇到了分段错误。

如果我删除两行中的一行

which_proc[my_rank].push_back(i); or 
which_point[my_rank].push_back(j); 

即使有4个处理器,代码也能正常工作。

我还注意到,分段错误总是与秩2相关联。因此,如果我在上述两行中的一行之前设置条件if(my_rank!= 2),则代码在4个处理器中工作。

我在这个问题上看到的帖子很少,但在大多数情况下,错误是从传递给push_back()的空指针发生的。

在这里,我只是推回一个整数,当它被推到一个向量时,这显然存在。

知道我怎么能抓住这个错误吗?

谢谢

1 个答案:

答案 0 :(得分:0)

最常见的是,当你同时尝试push_pack时,你最终会发生segfaulting的原因是因为在一个线程中你可能会尝试push_back,所以向量被重新分配(所有迭代器都被无效),而另一个线程尝试push_back到现在无效的内存(另一个线程&#34;不知道&#34;同时重新分配向量,即将使用无效的迭代器)。

Is std::vector or boost::vector thread safe?

可能重复