STL 2D矢量致命运行时错误

STL 2D Vector Fatal Runtime Error

本文关键字:运行时错误 2D STL      更新时间:2023-10-16

我有以下代码:

vector<vector<Obj> > vectObjVects(10);
vectObjVects[0].reserve(100);

在运行时,在代码的第三行,我得到了一个由_SCL_SECURE_VALIDATE_RANGE(_Pos<size())行引发的"致命错误";"在矢量标准标头中,这可能是因为它不喜欢我在设置大小之前尝试索引到vectObjVects。

在填充任何值之前,在2D向量的内部向量中保留空间的推荐方法是什么?

EDIT-根据请求添加的对象类:

class Obj
{
public:
Obj(int a, int b):iA(a), iB(b) {} 
Obj():iA(0), iB(0) {}
int iA;
int iB;
};

您发布的代码中似乎没有错误(请参阅下文)。

对您的问题最可能的解释是:

  • 您发布的代码与您正在运行的代码不完全匹配
  • 其他一些你认为不相关的代码正在与你的向量交互,可能是破坏了它们存储的内存

我的建议是,在调用reserve之前,使用调试器检查vectObjVects的状态。如果这看起来还可以,那么进入reserve的代码,看看_Possize()的值是多少。它们应该是010——如果它们不是,那么这应该为你指明正确的方向。


以下代码完全按照预期编译和运行:

#include <vector>
class Obj
{
public:
Obj(int a, int b):iA(a), iB(b) {} 
Obj():iA(0), iB(0) {}
int iA;
int iB;
};
int main() {
  std::vector<std::vector<Obj> > vectObjVects(10);
  vectObjVects[0].reserve(100);
}

一旦知道向量应该有多长,就可以使用resize()来保留所需的"空间"。您的代码可能会失败,因为ObjVect没有大小,因为向量是空的。