2016-07-26 31 views
0

Ich bin neu in C++, während ich eine Tag-Klasse implementierte, stieß ich auf einen Laufzeitfehler. Nach dem Debugging habe ich festgestellt, dass der Laufzeitfehler durch Inkrementieren von Zeiger (**) attrib_list verursacht wurde, aber der andere Zeiger, der auf die gleiche Speicheradresse zeigt, verursacht keinen Fehler beim Inkrementieren, Bitte erklären Sie mir, was der Grund für dieses seltsame Verhalten ist ? I hackerrank Online-ide verwendet diesen CodeIch bekomme Laufzeitfehler beim Inkrementieren des Zeigers, was ist der plausible Grund?

class Tag{ 
public: 
    Tag(): 
     tagname{""}, sz{0}, t_sz{0}, attrib_list{nullptr}, ptr_nav{nullptr}{ 
    } 

    Tag(string name, int n_att): 
     tagname{name}, sz{0}, t_sz{n_att}, attrib_list{new string*[n_att]}{ 
      for(int i=0; i<n_att; i++){ 
       attrib_list[i] = new string[2]; 
      } 
      ptr_nav = &attrib_list[0];  //take risk here 
    } 

    ~Tag(){ 
     for(int i=0; i< t_sz; i++){ 
       delete[] attrib_list[i]; 
      } 
     attrib_list = nullptr; 
     ptr_nav = nullptr; 
     t_sz, sz = 0; 
    } 


    // this function produces rintime error 
    void add_attribute(string name, string value){ 
     (*attrib_list)[0] = name; 
     (*attrib_list)[1] = value; 
     sz++; 
     attrib_list++; 
    } 


    /* 
    This does not produce any error, why ???? 
    void add_attribute(string name, string value){ 
     (*ptr_nav)[0] = name; 
     (*ptr_nav)[1] = value; 
     sz++; 
     ptr_nav++; 
    } 
    */ 

private: 
    string tagname; 
    string **attrib_list, **ptr_nav; 
    int sz, t_sz; 
}; 

int main() { 
    Tag t("tag1", 2); 
    t.add_attribute("value1", "1"); //runtime error 
    t.add_attribute("value2", "2"); //runtime error 
    return 0; 
} 
+1

Wenn Sie nicht versuchen, über Zeiger zu lernen, würde ich Ihnen dringend empfehlen, 'vector' und' unique_ptr' zu verwenden. – Arunmu

Antwort

0

Nach zwei Anrufe add_attribute zu kompilieren, wird attrib_list erhöht zweimal und zeigt nun nach dem Ende des ursprünglichen new[] -allocated Array. Was an sich kein Problem ist.

Aber dann Tag Instanz geht out of scope, seine Läufe destructor und versucht attrib_list[i] auf einem jetzt-invalid attrib_list Zeiger zuzugreifen, was natürlich nicht definiertes Verhalten zeigt.


ohne Bezug zur unmittelbaren Ausgabe: t_sz, sz = 0; nicht 0 zu zwei Variablen zuweisen (wie Sie scheinen zu glauben), sondern nur zu sz. Lesen Sie über den Komma-Operator in Ihrer bevorzugten C++ - Referenz. In jedem Fall müssen Sie das überhaupt nicht machen (und auch nicht die beiden Zeiger auf nullptr setzen) - sie werden sowieso zerstört, ihre Werte spielen keine Rolle.

+0

Ja richtig, haha ​​... wie habe ich das übersehen: P –