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

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

#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

1 Ответ

0 голосов
/ 22 октября 2018
            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 здесь ноль.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...