stl — Двойная бесплатная ошибка / повреждение в C ++ при использовании глобально объявленных векторов

Для этого кода

#include<bits/stdc++.h>
#include<iostream>
#include<vector>

using namespace std;

vector<long long int> v1,v2;

int main(int argc, char const *argv[]){
long long int t, n, i, x, day_count;
scanf("%llu", &t);
while(t--){
scanf("%llu", &n);
for(i=0; i<n; i++){
scanf("%llu", &x);
v1.push_back(x);
v2.push_back(0);
}
day_count = SpreadTheWord(n);
printf("%llu\n", day_count);
v1.clear();
v2.clear();
}
return 0;
}

Я получаю вывод, который хочу, но после того, как main выполняет ‘return 0’, я получаю эту ошибку

*** Error in `./a.out': double free or corruption (!prev): 0x0000000001d62e20 ***

Я получил ответ, используя другой код, но я хочу понять, почему этот код получает эту ошибку.

Я не думаю, что что-то не так с SpreadTheWord (), но на тот случай, если вы хотите увидеть, что делает SpreadTheWord ()

long long int SpreadTheWord(long long int n){
long long int dc = 0;
long long int i = 0, j, m;
j = i + 1;
long long int k = v1[i];
v2[i] = 2;
while(true){
if(v2[n-1] == 2){ //condition 1
return dc;
}
if(k!=0 && v2[i] == 2){ //condition 2
v2[j] = 1;
k--;
j++;
}
else if(k==0){ //condition 3
i++;
if(v2[i] == 2)  //condition 3.1
k = v1[i];
else{               //condition 3.2
m= 0;
while(v2[m] != 0){
v2[m] = 2;
m++;
}
i = 0;
dc++;
k = v1[i];
}
}
}
return dc;
}

Спасибо!

РЕДАКТИРОВАТЬ: Извините, я забыл прикрепить вход

3
10
1 1 1 1 1 1 1 1 1 1
10
2 2 2 2 2 2 2 2 2 2
10
3 3 3 3 3 3 3 3 3 3

Проблема была отсюда: https://www.codechef.com/SNCKQL19/problems/SPREAD2

0

Решение

            while(v2[m] != 0){
v2[m] = 2;
m++;
}
if(k!=0 && v2[i] == 2){ //condition 2
v2[j] = 1;
k--;
j++;
}

Доказывая это v2[j] а также v2[m] всегда в пределах v2 нетривиально.

В общем, SpreadTheWord это куча логики спагетти и, вероятно, портит кучу.


замещать [x] с .at(x) чтобы получить исключения, а не повреждение памяти.

Объявите переменные настолько близко к их инициализации, насколько это возможно, и сделайте так, чтобы они выпадали из области видимости как можно скорее, чтобы уменьшить переменные длины и уменьшить количество программ «состояния».

Назовите разумные имена.

Разобраться с возможностью:

        for(i=0; i<n; i++){
scanf("%llu", &x);
v1.push_back(x);
v2.push_back(0);
}

n быть ноль здесь.

Ваш код делает достаточно указателя и арифметики индекса, я был бы удивлен, если это не было разрушая кучу, записывая за пределами вектора.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector