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

时间:2019-03-07 20:17:52

标签: c++ vector stdvector

这段代码说的是: (代码尝试填充外观数组直到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]);
    }

我有

  

访问冲突读取位置0xFFFFFFFFFFFFFFFFFF

在for语句中,行appearanceArrayOfNumThings[currentNumberOfThings ].push_back(arrayOne[i]);

我正在考虑是否是因为我不知道矢量行为。

您能给我任何线索还是看到我做错了什么吗?

1 个答案:

答案 0 :(得分:2)

首先,您应该使用调试器,您会立即发现该错误。

第二,new vector<Thing>[maxNThings]是一个不好的想法。 不要这样做 。至少使用std::vector<std::vector<Thing>>。在我看来,包含向量的结构向量更加清晰。

使用向量vector,您可以使用.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,它将始终失败。