另一个程序崩溃在vector.push_back()

时间:2014-07-11 03:36:21

标签: c++ c++11

我正在编写一个从文本文件中读取数据的程序,以各种方式对数据进行排序,然后将排序后的数据用于其他计算。让我说在int main(){ }中有一个包含许多其他for循环的大型for循环,并且我发布的代码段只是主要循环中的许多for循环中的一个。

 for(t=(compare.t - 1000)*2 - 12 ;t< ( (compare.t - 1000)*2 + 12 /);t++){

  rank.push_back(vector <int>() );p++;


     for(ii=111;ii<2489;ii++){
          if(M_screened[a][ii].size()>0){

             if( fabs(M_screened[a][ii][0].t-(t*0.5 + 1000.0)) <0.257 ){
                  cout<<"ii = "<<ii<<" t = "<<t<<"  sizeof(rank) = "<<rank.size()<<"  p = "<<p;
                  cout<<"   rank["<<p<<"].size() = "<<rank[p].size()<<endl;
                  cout<<"   "<<endl;
                  cout<<"address = "<<&rank[p][rank[p].size()-1];
                  rank[p].push_back(ii);
                  cout<<" "<<endl;
              }
          }
      }       
 foutT<<t*0.5 + 1000<<" "<<frequency[a][t]<<endl;} //end t-loop

所有cout语句都只是我自己的错误检查过程的一部分。此外,包含上述代码段的大型for循环能够在第三次(每次)崩溃之前运行2次迭代。

基本上我把它缩小到了就是在push_back()函数上崩溃了。崩溃时的参数值:

t=177, p = 10, ii = 873, sizeof(rank) = 11, rank[10].size() = 1

以下是我从Microsoft Visual Studio收到的错误消息:

Unhandled exception at 0x0000000077993290 (ntdll.dll) in Muon_fitting7_7_2014_statistics.exe: 0xC0000005: Access violation reading location 0x0000038085FFA1E8.

如果我能提供任何其他信息,请告诉我。

1 个答案:

答案 0 :(得分:0)

我假设你在声明时将P初始化为零或某些此类事情,这实际上是你的问题。

for(t=(compare.t - 1000)*2 - 12 ;t< ( (compare.t - 1000)*2 + 12 /);t++)
{
    rank.push_back(vector <int>() );p++;
    for(ii=111;ii<2489;ii++)
    {
        if(M_screened[a][ii].size()>0){
            if( fabs(M_screened[a][ii][0].t-(t*0.5 + 1000.0)) <0.257 ){
              rank[p].push_back(ii);
            }
        }
    }   
}

首先,排名没有元素,然后你推回并增加p。现在排名为1元素,但你需要使用rank [p-1]来访问它,因为p已经是1.或者将p初始化为-1以启动,所以当你递增它时,它为零。 Vector []访问基于零。

所以,试试这个:

int p = -1;
for(t = ((compare.t - 1000)*2 - 12);t < ((compare.t - 1000)*2 + 12);++t)
{
    rank.push_back(vector <int>() );
    ++p;
    for(ii=111;ii<2489;++ii)
    {
        if (M_screened[a][ii].size() > 0)
        {
            if (fabs(M_screened[a][ii][0].t-(t*0.5 + 1000.0)) < 0.257)
            {
                rank[p].push_back(ii);
            }
        }
    }   
}