2011-10-20 21 views
-2

なぜ私のコードがセグフォールトであるのか分かりません。私はキュー内のどこにも何もないところを見ていると仮定していますが、要素をキューにプッシュすると思っていました。セグメンテーションフォールトC++

HERESに私のコード:if文はforループ内で働いている場合は、私がチェックしたときに、それはそれに入るが、その場合イムわからいないため

template <typename T> 
class btree { 

    public: 
    btree(size_t maxNodeElems); 
    ~btree() {} 

    struct node { 
     list <T> elements; 
     node *lvl; 
    }; 

    private: 
    size_t maxNodeElems; 
    node* root; 

}; 

template <typename T> 
btree<T>::btree(size_t maxNodeElems) { 
    if (maxNodeElems > 0) max = maxNodeElems; 
    root = new node; 
    root->lvl = new node*[max+1]; 
    for (int i = 0; i < (int) max+1; i++) root->lvl[i] = new node; 
} 

template <typename T> 
std::ostream& operator<<(std::ostream& os, const btree<T>& tree) { 

    queue <typename btree<T>::node*> q; 
    q.push(tree.root); 
    int loop = 0; 
    while (!q.empty()) { 
    loop++; 
    typename btree<T>::node* temp = q.front(); 
    int i = 0; 

    class list <T>::iterator itr = temp->elements.begin(); 
    for (; itr != temp->elements.end(); ++itr) { 
     os << *itr << " "; 
     if (!temp->lvl[i]->elements.empty()) { 
     q.push(temp->lvl[i]); 
     } 
     i++; 
    } 

    q.pop(); 
    } 

    return os; 
} 

誰かが私を助けることができる、イムが失わより多くのコード私のTEST.CPPで

template <typename T> 
pair <typename btree<T>::iterator, bool> btree <T>::insert (const T& elem) { 
    pair <typename btree<T>::node, bool> start; 
    start = addElement (elem, root); 
    pair <typename btree<T>::iterator, bool> final; 
    return final; 
} 

template <typename T> 
pair <typename btree<T>::node, bool> btree<T>::addElement (const T& e, typename btree<T>::node*& n) { 

    pair <typename btree<T>::node, bool> elemPair; 

    if (n->elements.size() == max) { 
    int count = 0; 
    class list <T>::iterator itr = n->elements.begin(); 
    for (; itr != n->elements.end(); ++itr) { 
     count++; 
     if (e < *itr) { 
     count--; 
     elemPair = addElement (e, n->lvl[count]); 
     } else if (e == *itr) return make_pair (*n, false); 
    } 

    } else { 
    n->elements.push_back(e); 
    n->elements.sort(); 
    } 


    return make_pair(*n, true); 
} 

EDITを押し

int main (void) { 

    btree<char> b(2); 
    b.insert('Z'); b.insert('J'); b.insert('Y'); 
    cout << b; 
    return 0; 
} 
+1

デバッグシンボル( 'gcc -g -O0')でコンパイルし、' valgrind'を通して実行します。 –

+0

@BrendanLongそれは何をしますか(まだプログラミングにはまだ新しいです) – SNpn

+0

あなたのコードが壊れている場所を教えてくれます。これらの手順はLinux上で動作します(プログラムがどこで、なぜあなたのプログラムがクラッシュするのかを正確に伝えます)。 IDEのデバッガを使用すると、他のプラットフォームでも同様の結果が得られます。 –

答えて

0

投稿したコードがコンパイルされないため、エラーを確認できません。

以下はコンパイルされているため、いくつかの助けが得られるかもしれません。あなたが提供したコードに似ています。

好ましくないコード - たとえば、コンストラクタでの例外ハンドリングがより困難であるため、newキーワードをコンストラクタで使用する際に注意する必要があります。割り当て例外がスローされます)。

template <typename T> 
class btree { 

public: 
    btree(size_t maxNodeElems); 
    //if your using new then you need to delete - do that in the destructor. 
    ~btree(); 
    struct node { 
    list <T> elements; 
     //you use this as a pointer to an array, 
     // it can be demoted to a double pointer - 
     // but not a single pointer as you had. 
     node ** lvl; 
    }; 

    private: 
    size_t maxNodeElems; //you don't actually use this variable in your code 
    node* root; 
    //You are doing memory allocations in the constructor, 
    // therefore need to overload operator= and copy constructor. 
    // Since we are not overloading these, we make them private. 
    void operator=(const btree&); 
    btree(const btree&); 

}; 


//In your code you had a undeclared variable max. 
// No idea what it was or why you had it - removed. 
template <typename T> 
btree<T>::btree(size_t v_maxNodeElems) 
    : maxNodeElems(v_maxNodeElems) // construct the variable you define 
{ 
    root = new node; 
    root->lvl = new node*[maxNodeElems+1]; //root->lvl is a double pointer 
    for (int i = 0; i < (int) maxNodeElems+1; i++) 
    root->lvl[i] = new node; 
} 

//delete in reverse order to you constructing 
template <typename T> 
btree<T>::~btree() { 
    for (int i = 0; i < (int) maxNodeElems+1; i++) 
    delete root->lvl[i]; //first the elements of the array 
    delete[] root->lvl; //then the array - note the delete[] 
    delete root; //then the root. 
} 

int 
main (int ac, char **av) 
{ 
    btree<char> b(2); 
} 
関連する問題