2012-07-26 18 views
5

Mam std::vector<double> W którym GDB pokazuje go zawierające następujące wartości:std :: vector <double> zniszczenie rzuca SIGABRT

Wph <5 items>   vector<double> 
    [0] 10.750281685547618  double 
    [1] 0.0053087812248281997 double 
    [2] 4.2807534148705719e-08 double 
    [3] 5.7427427663508097e-07 double 
    [4] 0      double 

Przy automatycznym zniszczenia gdy funkcja jest wyjściem, to rzuca SIGABRT.

0 raise raise.c 64 0x7fffeec5ad05 
1 abort abort.c 92 0x7fffeec5eab6 
2 __libc_message libc_fatal.c 189 0x7fffeec93d7b 
3 malloc_printerr malloc.c 6283 0x7fffeec9fa8f 
4 _int_free malloc.c 4795 0x7fffeec9fa8f 
5 __libc_free malloc.c 3738 0x7fffeeca38e3 
6 __gnu_cxx::new_allocator<double>::deallocate new_allocator.h 95 0x457828  
7 std::_Vector_base<double, std::allocator<double> >::_M_deallocate stl_vector.h 146 0x45567e  
8 std::_Vector_base<double, std::allocator<double> >::~_Vector_base stl_vector.h 132 0x4542b3  
9 std::vector<double, std::allocator<double> >::~vector stl_vector.h 314 0x453a96 

Co się dzieje?

int data = 0; 
    vector<double> Wph; 
    Wph.resize(mydata.data.size()); 

    for (size_t t = 0; t < mydata.t.size(); t++) 
    { 
    double t0 = (PI/180.0) * mydata.t[i]; 

    for (size_t p = 0; p < mydata.p.size(); p++) 
    { 

     double _Wph = 5; //arbitrary math 
     Wph[data] = _Wph; 

     data++; 
    } 
    } 

struct mydata 
{ 
    vector<double> t, p; 
    vector<point> data; 
}; 
+3

Dodaj kod, proszę. – ForEveR

+4

Nie można udzielić odpowiedzi w obecnej formie (bez * udziału * zgadywania). Rozważ dodanie kompletnego i minimalnego przykładowego programu, który eksponuje twój problem. – Mankarse

+0

Dobra, chwileczkę. – Drise

Odpowiedz

3

Proszę się upewnić, że mydata.data.size() == mydata.t.size() * mydata.p.size().

Przydzielono wartości mydata.t.size() * mydata.p.size() do wektora z elementami mydata.data.size(). To jest zapis związany z tablicą.

Może powinieneś spróbować zamiast tego vector::push_back(). Oznacza to, że

vector<double> Wph; 

for (size_t t = 0; t < mydata.t.size(); t++) 
{ 
    double t0 = (PI/180.0) * mydata.t[i]; 

    for (size_t p = 0; p < mydata.p.size(); p++) 
    { 
    double _Wph = 5; //arbitrary math 
    Wph.push_back(_Wph); 
    } 
} 
+0

Nie robi. data = 5, p = 2, t = 3 – Drise

+0

nie powinno to być 'mydata.data.size() == mydata.t.size() * mydata.p.size()'? –

+0

@yurikilochek Popełniłem błąd. Naprawiłem to przez edycję. – timrau

0

data = 5, p = 2, t = 3

for (size_t t = 0; t < mydata.t.size(); t++) 
    { 
    double t0 = (PI/180.0) * mydata.t[i]; 

    for (size_t p = 0; p < mydata.p.size(); p++) 
    { 

     double _Wph = 5; //arbitrary math 
     Wph[data] = _Wph; 

     data++; 
    } 
    } 

Tak, masz podwójną pętlę. I masz 6 iteracji ... więc uszkodzona pamięć będzie na t == 2 i p == 1, ponieważ spróbujesz zrobić Wph[5] = _Wph i maksymalny indeks prawny dla Wph, jeśli jego rozmiar == 5 to 4.

0

Robi się Wph za mały, podejrzewam. Nie wiemy, co to jest mydata.data.size(), ale przypuszczam, że jest za mały.

z kodu, wygląda prawidłowy rozmiar jest

Wph.resize(mydata.p.size() * mydata.t.size()); 

Jednak w C++ staramy się pisać kod w obronie tak jak błędy, które są trudniejsze do wykonania.

vector<double> Wph; 

    for (size_t t = 0; t < mydata.t.size(); t++) 
    { 
    double t0 = (PI/180.0) * mydata.t[t]; 

    for (size_t p = 0; p < mydata.p.size(); p++) 
    { 
     double _Wph = 5; //arbitrary math 
     Wph.push_back(_Wph); 
    } 
    } 

Jeśli trzeba wstępnie przeznaczyć rozmiaru, to przynajmniej zmianę

 Wph[data] = _Wph; 

do

 Wph.at(data) = _Wph; 

w() działa tak samo jak [], z wyjątkiem, że w() sprawdza, czy nie przekroczyłeś końca tablicy i zgłaszasz wyjątek.

Powiązane problemy