-1

二分木を作成するために使用されるポインターのスタックを作成しました。スタックを個々のノードで埋めることはできますが、実際のツリーを作成できるように最上位ノードのメモリを新しいノードに割り当てようとすると、segfault が発生します。例として:

TreeNode *c = new TreeNode;
c = stack.top(); //this segfaults

これがどのように機能するかを誤解しているかどうかはわかりませんが、どちらも同じ型であるため、 c はスタックの一番上に等しくならないのでしょうか? 私はこれで何時間も立ち往生しています。

4

1 に答える 1

1

C++/C でポインターがどのように機能するかを誤解していると思います。これらは、メモリ アドレスを表す単なる整数値です。このnewキーワードは、クラスにメモリを割り当ててから、そのクラスのコンストラクターを呼び出します。

だからあなたが書いたことから

TreeNode *c = new TreeNode;

Treenode にポインターを割り当てます。次に、Treenode にメモリを割り当て、そのコンストラクタを呼び出して、このメモリ ブロックのアドレスをポインタに割り当てます。

c = stack.top(); //this segfaults

関数呼び出し stack.top() によって返されたアドレス/ポインター値を取得し、それを変数 c に割り当てます。

クリスが言ったように、コードが機能していたとしても、c ++にはガベージコレクターがないため、リークです。そのため、 c= stack.top() を実行すると、以前に割り当てられたメモリがヒープで失われます。

また

Treenode *c = new Treenode;
delete c;
c = stack.top();

または

Treenode *c = stack.top();

あなたの観察可能な問題は、stack.top() への呼び出しのどこかにあります。このようなポインターチュートリアルをお勧めします。

http://www.codeproject.com/Articles/627/A-Beginner-s-Guide-to-Pointers

于 2012-09-25T03:51:39.637 に答える