2017-03-17 7 views
-2

実行時に、このコードが実行されている間にnullptr例外が発生しています。デバッガを投げるnullptr例外nullptr中にチェックする

bool Tree::Insert(int n) 
{ 
    if (root == nullptr) // This is where it throws 
    { 
     Node* root = new Node(n); 
     return true; 
    } 

Tree.h

private: 
Node* root; 

とツリーのコンストラクタで初期化。

Tree::Tree() 
{ 
    root = nullptr; 
} 

私は以前とまったく同じようにコード化しており、例外は発生しませんでした。

UPDATE: 私は余分な '}' の木::挿入()上の混乱をお詫び申し上げます。より多くのコードがあり、それらはすべてリターン・ケースを持っています。私は前にこれを持っていた。

Node* newNode = new Node(n); 
root = newNode; 

しかし、別の理由でそれを変更した。

Node.h

#pragma once 

struct Node 
{ 
    int data; 
    Node *left; 
    Node *right; 

    // Constructor 
    Node() { data = 0; left = nullptr; right = nullptr; } 
    // Parameterized 
    Node(int d) { data = d; left = nullptr; right = nullptr; } 
    // Destructor 
    ~Node() { data = 0; } 
}; 
+0

してください、最小限の完全かつ検証可能な例を提供します。https://stackoverflow.com/help/mcve –

+3

ないすべてのパスがツリー 'に戻る:: Insert'を、それはところであなたは新しい'ルートを定義している未定義の動作 – Danh

+4

です'新しいスコープ内で変数を変更し、クラス変数をシャドーイングします。 – pinkfloydx33

答えて

2

または使用しているTreeクラスのインスタンス(それは静的メンバであるかのようにTreeクラスのインスタンスを経由して、すなわちではない)あなたは直接Tree::InsertメンバーにアクセスのいずれかInsertメソッドにアクセスするには初期化されていません。言い換えれば

thisはnullです。

+0

@TobySpeight、まさに!これは私があなたのコメントに気づいたときに入力したものです。 –

+0

私はそんなにばかです。問題は私の運転手にあった。 「Tree * Binary_Tree = new Tree;」と入力して適切に初期化するのではなく、私は代わりに "Tree * Binary_Tree;"とタイプしました。このため、コンストラクタは呼び出されませんでした。 –

-1

nullptrは実装固有です。あなたが言うとき、 "私は以前と全く同じようにコーディングしており、例外を投げたことはありません。" 異なるコンパイラであるかどうかを確認する必要があります。

+0

'nullptr'は実装特有の意味がありません。 'nullptr_t :: operator =='は標準で完全に指定されています。 –

関連する問題