2016-03-30 8 views
0

Я пытаюсь выполнить сортировку вставки по векторам на C++, но мой ./a.out возвращает это: * Ошибка в `./insertion ': двойная свобода или коррупция (out): 0x000000000154fc20 *Double Free или Corruption (out): 0x000000000154fc20 в C++

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

Это код:

#include<iostream> 
#include<vector> 

using namespace std; 


void insertion(vector<int> v){ 
    int tam = v.size(); 
    int key,j,i; 
    for(i=1; i<tam; i++){ 
    key = v[i]; 
    j=i-1; 
    while(j>=0 && v[j]>key){ 
     v[j+1] = v[j]; 
     j--; 
    } 
    v[j]=key; 
    } 
} 

void print(vector<int> v){ 
    cout<<endl; 
    for(int i = 0; i<v.size(); i++){ 
    cout<<i+1<<".\t"<<v[i]<<"\n"; 
    } 
} 

int main(){ 
    cout<<"----------------INSERTION SORT----------------\n\n"; 
    cout<<"\nPlease, fill the vector: \n\n"; 
    vector<int> v; 
    int a; 
    bool response = true; 

    while(response){ 
     cout<<"\nEnter your number: "; 
     cin>>a; 
     v.push_back(a); 
     cout<<"Another?(1/0): "; 
     cin>>response; 
     cout<<endl; 
    } 
    insertion(v); 
    print(v); 

    return 0; 
} 
+2

"и это всегда о коде" - да, это так. –

+0

научиться использовать отладчик –

+0

Valgrind будет полезен здесь. компилировать с -g и делать valgrind ./executable – PYA

ответ

0

В этом фрагменте кода, в вставки(),

j=i-1; 
while(j>=0 && v[j]>key){ 
    v[j+1] = v[j]; 
    j--; 
} 
v[j]=key; 

По определению, цикл while прекращается, когда j<0 или v[j]>key. Когда он заканчивается, потому что j<0, назначение v[j]=key повреждает память, так как это по существу v[-1]=key.

+0

Спасибо за акселератор –

-1

У вас есть два варианта, чтобы исправить этот код:

1)

j=i-1; 
    while(j>=0 && v[j]>key){ 
     v[j+1] = v[j]; 
     j--; 
    v[j]=key; 
    } 

2)

j=i-1; 
    while(j>=0 && v[j]>key){ 
     v[j+1] = v[j]; 
     j--; 
    } 
    v[j+1]=key; 
+0

Я этого не замечал, также мне очень странно, что тип уведомления об ошибке, btw, я начинаю программировать C++ в терминале Ubuntu, возможно, поэтому я этого не понял. Большое спасибо: D –