2016-05-03 17 views
1

So wie mein erster C++ Programm, das ich einen wenig Binärbaum machen wollte, aber nach dem ersten Wert nach dem root eingeben:this -> m_xy war ein nullptr

Exception geworfen: Zugriffsverletzung schreiben.

dies-> m_left war nullptr.

Meine Testeingabe: abnehmende int-Zahlen.

Mein Code:

#include<iostream> 

class BinaryTree 
{ 
public: 
    BinaryTree *m_left; 
    int m_key; 
    BinaryTree *m_right; 

    void insert(int value) 
    { 
     BinaryTree son; 

     if (value <= m_key) 
     { 
      if (m_left == NULL) 
       *m_left = { NULL, value, NULL }; //Error 
      else 
      (*m_left).insert(value); 
     } 
     //uniportant stuff ... 
    } 

    //unimportant stuff 
}; 

int main() 
{ 
int rootValue(0); 
std::cout << "Enter a value for the root: "; 
std::cin >> rootValue; 
std::cout<<std::endl; 

BinaryTree root = { NULL, rootValue, NULL }; 

int leafValue(1); 
std::cout << "Enter a value for the leaf or enter 0 to finish: "; 
std::cin >> rootValue; 
while (leafValue != 0) 
{ 
    root.insert(leafValue); 
    std::cout << "Enter a value for the leaf or enter 0 to finish: "; 
    std::cin >> rootValue; 
    std::cout << std::endl; 
} 

root.print(); 

return 0; 

} 
+1

Es sieht aus wie Sie de-Referenz der Zeiger vor einem Objekt für sie die Zuteilung, sie nicht automatisch erstellt werden. Du wirst sie irgendwo "neu" usw. brauchen. – Niall

+0

ah ja, danke :). Das hat mir schon geholfen! – Bubibob

Antwort

3

Wenn Sie Ihren root Knoten zu erstellen, erstellen Sie ein lokales BinaryTree Objekt.

Wenn Sie dann Ihren ersten Wert legen, m_left ist NULL, in dem folgenden Zweig:

if (m_left == NULL) 
    *m_left = { NULL, value, NULL }; // Assignment to a NULL pointer. 

Was passiert? Sie de-referenzieren einen Null-Zeiger, um ein Objekt zu kopieren. An diesem Punkt ist das Verhalten undefiniert und zum Scheitern verurteilt.

Bevor dem de-referenzierten Zeiger (* m_left) etwas zugewiesen wird, muss der Zeiger auf ein gültiges Objekt zeigen.

Sie können die Zuordnung wie folgt korrigieren:

m_left = new BinaryTree{ NULL, value, NULL }; 
+0

Danke, das ist sogar ein bisschen besser als das, was ich geschafft habe :) – Bubibob

1

Ok, Problem gelöst. Einfach

geändert
 *m_left = { NULL, value, NULL }; 

in

 m_right = new BinaryTree; 
     (*m_right).m_left = NULL; 
     (*m_right).m_key = value; 
     (*m_right).m_right = NULL; 

thx Niall