2017-07-06 5 views
-2
#include <iostream> 
using namespace std; 
struct node{ 
    int val; 
    node* left, *right; 
}; 

void _delete(node *root) 
{ 
    root = NULL; 
} 
void change(node *root) 
{ 
    root->val = 6; 
} 
int main() 
{ 
    node * root = new node; 
    root->val = 5; 
    change(root); 
    _delete(root); 
    cout<<root->val<<endl; 
    return 0; 
} 

を動作しません上記のプログラムの出力は6である_delete機能は、ルートノードには影響しないかのように思えますがchange機能は、ルートノードに影響を及ぼし。 deleteが渡された引数をローカル変数として扱うのとほぼ同じですが、changeはその引数をグローバル変数として扱います。私が逃している、またはこれが正常なことは何ですか?それが正常であれば説明してください。C++ - NULLにノードを設定すると

+0

"_delete関数がルートノードに影響を与えていないかのようです。"実際はそうではありません。なぜそれはすべきだと思いますか? "変更は引数をグローバル変数として扱います"、そうではありません。それは 'root-> val'を変更します。 'root'はまだそれにローカルです。 –

+0

@Downvoters、これはコンパイル可能な例ではっきりと書かれています。明白さの理由でダウンボトムダウンしないでください。 – Bathsheba

+0

演算子 'new'を使って割り当てたオブジェクトの割り当てを解除していないので、コードもメモリをリークします。ポインターを他の値に設定しても、ポインターが指すオブジェクトの割り振りは解除されません。そして、 '_delete'がポインタを' NULL'に設定すると仮定すると、 'cout < val << endl;'で 'NULL'ポインタを間接参照します。 PS:アンダースコアで始まる名前はC++で予約されています。 – jotik

答えて

4

ポインタを関数の値で渡すので、呼び出し元の値は変更されません。

最速修正、すなわち参照によってポインタを渡す

void _delete(node*& root)

を記述することである:&に注意してください。ポインタの上にdeleteと呼ぶこともできます。そうしないと、メモリがリークします。関数changeは、というメンバへのポインタオペレータ->を使用しているのでそのまま使用できます。

関連する問題