-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にノードを設定すると
"_delete関数がルートノードに影響を与えていないかのようです。"実際はそうではありません。なぜそれはすべきだと思いますか? "変更は引数をグローバル変数として扱います"、そうではありません。それは 'root-> val'を変更します。 'root'はまだそれにローカルです。 –
@Downvoters、これはコンパイル可能な例ではっきりと書かれています。明白さの理由でダウンボトムダウンしないでください。 – Bathsheba
演算子 'new'を使って割り当てたオブジェクトの割り当てを解除していないので、コードもメモリをリークします。ポインターを他の値に設定しても、ポインターが指すオブジェクトの割り振りは解除されません。そして、 '_delete'がポインタを' NULL'に設定すると仮定すると、 'cout < val << endl;'で 'NULL'ポインタを間接参照します。 PS:アンダースコアで始まる名前はC++で予約されています。 –
jotik