0

私は、C++で指定されたリンクリストのディープコピーコンストラクタを作成する必要がある割り当てに取り組んでいます。コピーコンストラクタ内のコードとポインタが正常に動作しますが、印刷機能が呼び出されるとき、私は、行59での関数でセグメンテーションフォールトを取得:メソッド呼び出しのセグメンテーションフォールト

cout << v->elem << " "; 

私は時間のためにこれをデバッグしようとしてきたと私は持っていますsegフォルトがなぜ発生するのかわかりません。割り当てのためのコード(コピーコンストラクタで唯一のコードは私のものです):

#include <iostream> 
#include <stddef.h> 
#include "intSLinkedList.h" 

using namespace std; 

intSLinkedList::intSLinkedList(const intSLinkedList& other){ 
    if(other.head == NULL){ 
     this->head = NULL; 
    } 

    else{ 
     intSNode* src_cursor = other.head; 

     while(src_cursor != NULL){ 
      this->addFront(src_cursor->elem); 
      src_cursor = src_cursor->next; 
     } 
    } 
} 

intSLinkedList::intSLinkedList(): head(NULL), tail(NULL) { } 

bool intSLinkedList::empty() const{ return head == NULL; } 

const int& intSLinkedList::front() const{ return head->elem; } 

//intSLinkedList::~intSLinkedList(){ while (!empty()) removeFront(); } 

void intSLinkedList::addFront(const int& e) {// add to front of list 
    intSNode* v = new intSNode;   // create new node 
    v->elem = e;       // store data 
     v->next = head;      // head now follows v 
     head = v;       // v is now the head 
    if (head->next==NULL) 
     tail = head; 
} 

void intSLinkedList::addBack(const int& e) {// add to front of list 
     intSNode* v = new intSNode;   // create new node 
     v->elem = e; 
    v->next = NULL;       // store data 

    tail->next = v;      // head now follows v 
    tail = v; 
} 

void intSLinkedList::removeFront() {   // remove front item 
     intSNode* old = head;    // save current head 
     head = old->next;     // skip over old head 
     delete old;       // delete the old head 
} 

void intSLinkedList::print() { 
     intSNode* v = head; 
     while (v != NULL){ 
      cout << v->elem << " "; 
      v = v->next; 
    } 
    cout << endl; 
} 

int intSLinkedList::count() { 
     intSNode* v = head; 
    int n = 0; 
     while (v != NULL){ 
     n++; 
       v = v->next; 
     } 
    return n; 
} 

ヘッダーファイル:

class intSLinkedList; 

class intSNode { 
private: 
    int elem; 
    intSNode* next;  
    friend class intSLinkedList; 
}; 

class intSLinkedList { 
public: 
    intSLinkedList(); 

    intSLinkedList(const intSLinkedList& other); 

    bool empty() const; 

    const int& front() const; 

    //~intSLinkedList(); 

    void addFront(const int& e); 

    void addBack(const int& e); 

    void removeFront(); 

    void print(); 

    int count(); 

private: 
    intSNode* head; 
    intSNode* tail; 
}; 

とテスタファイル:

#include <iostream> 
#include "intSLinkedList.h" 

using namespace std; 

int main(){ 
    intSLinkedList int_sll; 
    int_sll.addFront(5); 
    int_sll.addFront(12); 
    int_sll.addFront(6); 
    cout << "int_sll : "; 
    int_sll.print(); 

    intSLinkedList int_sll2 = int_sll; 
    cout << "int_sll2 : "; 
     int_sll2.print(); 

    int_sll.addBack(100); 
    cout << "int_sll : "; 
    int_sll.print(); 
    cout << "int_sll2 : "; 
     int_sll2.print(); 

} 

マイGDB出力:

int_sll : 6 12 5 

Program received signal SIGSEGV, Segmentation fault. 
0x0000000000400cce in intSLinkedList::print (this=0x7fffffffe010) 
    at intSLinkedList.cpp:57 
57    cout << v->elem << " "; 

正しい方向のポイントは非常に高く評価されます。

+0

あなたはデバッガを開いています。フォールトまでのコードをステップ実行してみてください。 – tadman

+0

おそらく 'v'はNULLです。 – wallyk

+0

tailがnullptrの場合、addBackがクラッシュする –

答えて

2

nextの初期化に失敗したようですので、未定義の値であり、移動するとクラッシュしてしまいます。

あなたは表示されませんすべてのコンストラクタので、常にがすべてプロパティを初期化し、各コンストラクタ必ずバリアント。

関連する問題