2012-07-26 21 views
5

फेंकता मैं एक std::vector<double> जिसमें GDB यह इन मूल्यों से युक्त से पता चलता है:std :: वेक्टर <double> विनाश 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 
स्वत: विनाश करने पर

जब समारोह से बाहर निकल रहा है, यह एक 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 

क्या चल रहा है?

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

कृपया कोड जोड़ें। – ForEveR

+4

अपने वर्तमान रूप में जवाब देना असंभव है (बिना अनुमान के * बहुत *)। एक पूर्ण और न्यूनतम उदाहरण प्रोग्राम जोड़ने पर विचार करें जो आपकी समस्या का प्रदर्शन करता है। – Mankarse

+0

ठीक है, बस एक पल। – Drise

उत्तर

3

कृपया सुनिश्चित करें कि mydata.data.size() == mydata.t.size() * mydata.p.size()

आपने mydata.data.size() तत्वों के साथ वेक्टर में mydata.t.size() * mydata.p.size() मान असाइन किए। यह एक सरणीबद्ध लेखन है।

शायद आपको vector::push_back() को आजमाएं। यही कारण है कि

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

का उत्तर कैसे देना है। डेटा = 5, पी = 2, टी = 3 – Drise

+0

यह 'mydata.data.size() == mydata.t.size() * mydata.p.size()' नहीं होना चाहिए? –

+0

@yurikilochek मैंने गलती की। मैंने इसे संपादन के माध्यम से तय कर लिया है। – timrau

0

डेटा = 5, पी = 2, टी = 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++; 
    } 
    } 

तो, आप डबल पाश है,। और आपके पास 6 पुनरावृत्त हैं ... इसलिए स्मृति दूषित टी == 2 और पी == 1 पर होगा, क्योंकि आप Wph[5] = _Wph और WF के लिए अधिकतम कानूनी अनुक्रमणिका करने का प्रयास करेंगे यदि इसका आकार == 5 है 4.

0

आप बहुत कम Wph बना रहे हैं, मुझे संदेह है। हम नहीं जानते कि mydata.data.size() क्या है, लेकिन मुझे लगता है कि यह बहुत छोटा है।

कोड से, ऐसा लगता है कि सही आकार की तरह

Wph.resize(mydata.p.size() * mydata.t.size()); 
सी में

हालांकि ++ है हम तो ऐसे ही गलतियाँ करने के लिए कड़ी मेहनत कर रहे बचाव की मुद्रा में कोड लिखने की कोशिश।

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

आकार, तो कम से कम

 Wph[data] = _Wph; 

 Wph.at(data) = _Wph; 
पर

() करने के लिए परिवर्तन आप करना आवश्यक है पूर्व आवंटित, के रूप में [] एक ही काम करता है कि पर छोड़कर() जांचता है कि आप सरणी के अंत से पहले नहीं हैं और अपवाद फेंकता है।

संबंधित मुद्दे