2016-10-29 37 views
0

我正在實現一個鏈接列表類的拷貝構造函數,它將進行深層拷貝。這是我的代碼:鏈接列表深層拷貝構造函數

List(const List & rhs) { 
     Node* rhsFront = rhs.header->next; 
     Node* prev = header; 
     while (rhsFront) { 
      prev->next = new Node(rhsFront->data, nullptr); 
      rhsFront = rhsFront->next; 
      prev = prev->next; 
     } 
} 

但是,它崩潰這一行:

prev->next = new Node(rhsFront->data, nullptr); 

我做了什麼錯?

+0

由於未能在複製構造函數中初始化類成員,導致未初始化的指針解引用和未定義的行爲,從而出錯了。一般來說,如果你的類有一個工作的'insert()'或'append()'函數,可以通過將深層拷貝構造函數委託給默認的拷貝構造函數來實現深拷貝構造函數,遍歷從中複製的列表中的值,然後使用現有的類方法來初始化複製到的列表。這是一個完全錯誤的方式來實現一個拷貝構造函數。 –

回答

2
Node* prev = header; 

我猜頭有不被初始化,從而導致prev->旁邊是一個隨機指針(最有可能像0),並試圖寫入該點導致程序崩潰。如果是這樣,這可能會起作用。

List(const List & rhs) { 
    Node* rhsFront = rhs.header->next; 
    header = new Node(rhs.header->data, nullptr); 
    Node* prev = header; 
    while (rhsFront) { 
     prev->next = new Node(rhsFront->data, nullptr); 
     rhsFront = rhsFront->next; 
     prev = prev->next; 
    } 
} 
0

爲什麼你在下一個開始,而不是頭。 Node * prev = header;標題定義在哪裏?你已經分配了所需的內存?而是從標題開始並複製。

List(const List & rhs) { 
    Node* rhsFront = rhs.header; 
    Node* prev = header; 
    while (rhsFront) { 
     prev = new Node(rhsFront->data, rhsFront->next); 
     rhsFront = rhsFront->next; 
     prev = prev->next; 
    } 
} 

這樣您就可以複製所有節點而不會跳過標題。希望這是有道理的。 另外,您所得到的實際例外可能會提供關於哪些訪問是NPE的線索。