vector.back()抛出“偏移超出范围”错误

时间:2016-01-21 17:04:19

标签: c++ visual-studio-2010 vector stl

void GenerateNativeGamma(vector<float>& gammaNative,
                            float dDetX, 
                            float sdd,
                            float moduleGapX,
                            int nModule,
                            int nChanDetX)
{
    float L = 7*dDetX + (0.78/2+0.11/2);

    gammaNative.push_back(0);

    for (float n = 6.5; n>=-6.5; n--)
    {
        gammaNative.push_back( atanf(L/sdd)-atanf(n*dDetX/sdd));
    }

    gammaNative.push_back(2*atanf(L/sdd));

    if( !gammaNative.empty())
    {
           float lastBonM = gammaNative.back();    // ERROR HAPPENS HERE!!!
           gammaNative.push_back( lastBonM +2*atanf(moduleGapX/2/sdd)  );   
    }

    ......

}

int main()
{
      vector<float>  gammaNative;
      GenerateNativeGamma( gammaNative,  1.02,  869.5, 2.087,47, 24);

}

我通过引用将向量传递给main()的函数;目的是修改其中的向量。

然后我尝试获取最后一个元素via vector.back()时出现“偏移超出范围”错误,如下图所示:

enter image description here

向量不为空,因此它应该有back()。然后我不知道这里的问题是什么?或者这不是正确的方法,那么我应该如何修改另一个函数内的向量(动态)呢?非常感谢。

1 个答案:

答案 0 :(得分:2)

请注意,调整向量的大小可能会导致底层数组被移动,从而使所有指针,引用和迭代器无效。当你将push_back推送到你通过引用传递的向量时,它可以调整大小,当然,引用将变为无效。

快速解决方法是在调用函数之前在向量上使用reserve,确保可以将足够的元素推送到它而无需重新分配。

更好的解决方案可能是返回副本。

编辑:一个简单的例子

vector<float> vec;
vec.reserve(50);
funcThatAdds50Floats(vec);