2012-07-26 35 views
5

Tôi có một std::vector<double> Trong đó GDB cho thấy nó chứa các giá trị:std :: vector <double> phá hủy ném 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 

Sau khi phá hủy tự động khi hàm được thoát, nó ném một 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 

Điều gì đang xảy ra?

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

Vui lòng thêm mã. – ForEveR

+4

Điều này là không thể trả lời ở dạng hiện tại của nó (không có * nhiều * công việc đoán). Xem xét thêm một chương trình ví dụ hoàn chỉnh và tối thiểu thể hiện vấn đề của bạn. – Mankarse

+0

Được rồi, chỉ một lát. – Drise

Trả lời

3

Hãy đảm bảo mydata.data.size() == mydata.t.size() * mydata.p.size().

Bạn đã gán mydata.t.size() * mydata.p.size() giá trị vào một vector với các yếu tố mydata.data.size(). Đó là một mảng liên kết viết.

Có thể bạn nên thử vector::push_back() để thay thế. Đó là,

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

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

+0

không nên là 'mydata.data.size() == mydata.t.size() * mydata.p.size()'? –

+0

@yurikilochek Tôi đã phạm sai lầm. Tôi đã sửa nó qua chỉnh sửa. – 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++; 
    } 
    } 

Vì vậy, bạn có vòng lặp kép. Và bạn có 6 lần lặp ... do đó, bộ nhớ bị hỏng sẽ nằm trên t == 2 và p == 1, vì bạn sẽ cố gắng làm Wph[5] = _Wph và chỉ số pháp lý tối đa cho Wph nếu kích thước == 5 là 4.

0

Bạn đang làm Wph quá nhỏ, tôi nghi ngờ. Chúng tôi không biết những gì mydata.data.size() là, nhưng tôi đoán rằng nó là quá nhỏ.

Từ mã này, nó trông giống như kích thước chính xác là

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

Tuy nhiên trong C++ chúng tôi cố gắng viết mã phòng thủ rất sai lầm như vậy là khó khăn hơn để thực hiện.

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); 
    } 
    } 

Nếu bạn phải tiền phân bổ kích thước, sau đó ít nhất thay đổi

 Wph[data] = _Wph; 

để

 Wph.at(data) = _Wph; 

tại() hoạt động giống như [], ngoại trừ việc tại() kiểm tra rằng bạn không phải là quá khứ của mảng và ném một ngoại lệ.

Các vấn đề liên quan