1

私はこれをしました:

class Node {
  //
  int key;
  Node* next;

public:

  //
  Node() : key( -1 ), next( NULL ) {}
  Node( int i, Node* j ) : key( i ), next( j ) {}
  //
  ~Node() { delete next; }

  //
  static void head_insertion( Node* & head, int i );
  void print_list();
};


void Node::head_insertion( Node* & head, int i ) {


  cout << "insert() 1 head = " << head << endl; 
  // append the current list to n
  Node n(i, head);
  cout << "address of n = " << &n << endl;
  // make n the new head
  head = &n;
  //

  cout << "insert() 2 head = " << head << endl; 
}

頭の挿入が機能しない:

insert() 1 head = 0x7fff56821518
address of n = 0x7fff56821518
insert() 2 head = 0x7fff56821518
Segmentation fault: 11

2 つの質問があります。

  • で新しく作成された Nodenは、head_insertionが指すアドレスと同じアドレスを持ちますhead。どうしたの?
  • リストの次の要素のデストラクタへの再帰呼び出しがあると考えて、デストラクタを書きました。これは正しいです?
4

3 に答える 3

1

を割り当てるために動的メモリを使用しませんでしたn。最初のパススルーでリストに追加され、関数は終了しnて範囲外になります。2 番目のパスでは、たまたまスタックの同じ位置に来て、同じポインターを生成します。

于 2013-09-09T03:25:23.847 に答える
0

コードvoid Node::head_insertion( Node* & head, int i ):

Node n(i, head);
cout << "address of n = " << &n << endl;
// make n the new head
head = &n;

次のようにする必要があります。

Node *pn = new Node(i, head);
cout << "address of n = " << pn << endl;
// make n the new head
head = pn;

また、デストラクタ~Node() { delete next; }はリンク切れの原因となるため、避ける必要があります。

さらに... 全体の設計が問題を引き起こしています。

ノードを実装するクラスは何なので、ノードがすべきことを行います。

class Node {
  int key;
  Node* next;

public:

  Node() : key( -1 ), next( NULL ) {}
  Node( int i, Node* j ) : key( i ), next( j ) {}
  //
  ~Node() { }   // don't delete the next node here! Not the job of this object.


  void print_node();
};

class Linklist {
    Node *head;
public:
    Linklist(): head(0) {}
    static void head_insertion( Linklist & list, int i );
    void print_list();
    〜Linklist();       // traverse your list node and do the deletion here
}

リスト レベルで行うべきことを、クラス Linklist で処理するようにします。

于 2013-09-09T03:38:07.780 に答える
0

関数では、有効期間が関数スコープ内にvoid Node::head_insertion( Node* & head, int i )ある自動変数を作成しています。そのため、そのノードにアクセスしたい場合は、そのメモリ領域を所有していないため、関数の外で取得します。object を動的に作成できないようにするには:Node n()head_insertionsegmentation fault

Node* n = new Node(i,head)

最後の質問について:独自のデストラクタを作成しなくても、コンパイラはデフォルト バージョンを提供します。デストラクタはデストラクタを呼び出していないと思うので、なぜ再帰する必要がありますか。

于 2013-09-09T03:32:46.160 に答える