0

我正在处理赋值,我必须在C++中为给定的链表创建一个深层拷贝构造函数。拷贝构造函数中的代码和指针做工精细,但在打印功能被调用我在第59行中得到的功能分割故障:C++方法调用的分段错误

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,所以它是一个未定义的值,当你导航到它时你会崩溃。

你不显示你所有的构造变种所以要确保每个构造总是初始化所有属性。