2017-01-26 19 views
-2

トピックを検索しようとしましたが、ループ中に使用されたすべてのスレッドが見つかりました。これは、リンクリストの私はデストラクタで呼び出す関数(パラメータとして頭を渡す)であるリンクリストの再帰的デストラクタ

template <typename S> 
struct node { 
    S data; 
    node<S> * next; 
}; 

void destroy(node<T> * n) { 
    if(n->next != NULL){ 
     destroy(n->next); 
    } 
    delete n; 
} 

残念ながら結果はAである私は再帰的にこれをやりたいが セグメンテーション障害。 誰かが私を助けることができますか?

編集:私は見ることができるものから、完全なコード

#include <iostream> 

using namespace std; 


template <typename T> 
class List { 
    private: 

    template <typename S> 
    struct node { 
     S data; 
     node<S> * next; 
    }; 

    node<T> * first; 

    node<T> * get_last_p() { 
     if(first != NULL){ 
      return get_last(first); 
     } 
     return NULL; 
    } 

    node<T> * get_last(node<T> * n) { 
     if(n->next != NULL) { 
      return get_last(n->next); 
     } else { 
      return n; 
     } 
     return NULL; 
    } 

    void destroy(node<T> * n) { 
     if(n->next != NULL){ 
      destroy(n->next); 
     } 
     delete n; 
    } 


    public: 

    List() {first->next = 0;} 
    ~List() {destroy(first);} 

    void add(T element) { 
     node<T> * new_element = new node<T>; 
     new_element->data = element; 
     if(first == NULL){ 
      first = new_element; 
     } else { 
      get_last_p()->next = new_element; 
     } 
    } 

    T get_last() { 
     return get_last_p()->data; 
    } 

    T get_first() { 
     return first->data; 
    } 

}; 
+2

'n'は決してnullではありませんか? – KABoissonneault

+1

http://stackoverflow.com/help/mcve – xaxxon

+0

問題がどこにわからない場合は、問題がどこにないかわかりません。あなたのコードを投稿してください。 – xaxxon

答えて

2

は、Listのコンストラクタで、firstが初期化されず、その後すぐにアクセスされます。それは未定義の動作です。 firstが何らかの形でnullに初期化されていて、first->next = 0;が何らかの原因でクラッシュしない場合でも、destroyは元の引数がnullではないことを前提として、デストラクタのdestroyに失敗します。

私はあなたがfirstは値を保持することを意図していない場合は、あなたが最初にnullにfirstを初期化するようにコードをリファクタリングする必要があるとしている List() : first{ new node{} } { first->next = nullptr; }

に意味と仮定 - その周りに作業はありません - とfirstがすべてのコードで明示的にnullの場合を処理します。 null、無効または未定義ポインターのfirst->nextを割り当てることはできません。

+0

コンストラクタで 'first'を既に初期化しているとき、 'first'が実際の値を保持している場合、どうすれば 'add'関数をチェックインできますか? – cmplx96

+0

あなたが行ったことにさらに近似した解決策を提供するように編集しました – KABoissonneault

+0

あなたのコンストラクタで動作します。私は助けに感謝します! – cmplx96

関連する問題