[英]C++ Access violation reading location 0xFFFFFFFFFFFFFFFF in dynamic array of vectors
这段代码是这样说的:(代码试图填充外观数组直到 100)我在 arrayOne[0].numberOfThings 中修复了向量数组的大小,因为我知道它是它可以包含的最大项目数,你可以将其视为已知整数。
int max = 100;
int maxNThings = arrayOne[0].numberOfThings; //Integer that I know and I pickit as the max for dynamic array
vector<Thing>* appearanceArrayOfNumThings;
appearanceArrayOfNumThings= new vector<Thing>[maxNThings];
for (int i = 0; i<max;i++){
int currentNumberOfThings = arrayOne[i].numberOfThings;
appearanceArrayOfNumThings[currentNumberOfThings ].push_back(arrayOne[i]);
}
我有
访问冲突读取位置 0xFFFFFFFFFFFFFFFF
在for语句中,行appearanceArrayOfNumThings[currentNumberOfThings ].push_back(arrayOne[i]);
我在想是否是因为我不知道的矢量行为。
你能给我任何线索或者你看到我做错了什么吗?
首先,您应该使用调试器,您会立即发现错误。
其次, new vector<Thing>[maxNThings]
是个坏主意。 不要那样做。 至少使用std::vector<std::vector<Thing>>
。 在我看来,包含向量的结构向量更清晰。
使用向量向量,您可以使用.at()
来告诉您的错误。
此代码将始终调用未定义的行为。
int maxNThings = arrayOne[0].numberOfThings;
让我们暂时假设这个数字是12
。
appearanceArrayOfNumThings = new vector<Thing>[maxNThings]; // 12
这将创建一个包含 12 个向量的数组。 可从0
到11
索引。
for (int i = 0; i < max ;i++){
// ...
}
对于第一次迭代, i
等于0
。 让我们继续。
// i == 0
int currentNumberOfThings = arrayOne[i].numberOfThings;
此时, arrayOne[i]
与arrayOne[0]
值相同,因为i
等于0
。 所以currentNumberOfThings
等于12
,也就是maxNThings
。
appearanceArrayOfNumThings[currentNumberOfThings ]
此访问appearanceArrayOfNumThings[12]
超出范围,因为appearanceArrayOfNumThings
可从0
到11
索引。 你进入UB土地。 这是你的错误。
对于maxNThings
任何值,它总是会失败。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.