动态向量数组中的 C++ 访问冲突读取位置 0xFFFFFFFFFFFFFFFF

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]);
    }

我有

Access violation reading location 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 个向量的数组。可索引从 011.

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 是从 011 的索引。你进入 UB 土地。这是你的错误。

对于 maxNThings 的任何值,它总是会失败。