C ++ Место чтения нарушения доступа 0xFFFFFFFFFFFFFFFF в динамическом массиве векторов - PullRequest
0 голосов
/ 07 марта 2019

Кусок кода говорит что-то вроде: (Код пытается заполнить массив внешнего вида до 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]);

И я думаю, что это из-за векторного поведения, которого я не знаю.

Можете ли вы дать мне какую-нибудь подсказку или вы видите, что я делаю что-то не так?

1 Ответ

2 голосов
/ 07 марта 2019

Во-первых, вы должны использовать отладчик, вы бы сразу обнаружили ошибку.

Во-вторых, 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.

...