2013-10-05 57 views
0

我一直在做一個鏈表,並有一個功能CountListItems(),它通過值傳遞列表。複製將被創建並且複製構造函數被調用。當函數按值傳遞參數時,複製構造函數如何工作?

複製構造函數在試圖複製時崩潰。我很困惑,this在複製構造函數中指向什麼?在這種情況下沒有調用對象,對吧?

當我運行調試器時,this具有與參數相同的節點數,但其所有值都未初始化。

任何嘗試刪除this的節點都會導致崩潰。複製構造函數底部的行(1)是我當前的解決方案。即使程序正常工作,這是否會導致內存泄漏?

//main.cpp 

int CountListItems(LinkedList data); 

int main() 
{ 
    LinkedList list; 
    int x = 1; 
    list.InsertData(x); 

    /* Pass LinkedList by value, so that the copy constructor is invoked. */ 
    CountListItems(data); 

    return 0; 
} 

//LinkedList.h 

class LinkedList 
{ 
public: 
    struct Node 
    { 
     int data; 
     Node *prev; 
     Node *next; 
    } 

    /* Copy constructor */ 
    LinkedList(LinkedList &original); 
    ~LinkedList(); 
    DataInsert(int data); 

private: 
    /* Copy list node by node. */ 
    void CopyList(LinkedList &original); 
    Node *first; 
    Node *curr; 
    Node *last; 

}; 

//LinkedList.cpp 

/* Copy Constructor */ 
LinkedList::LinkedList(LinkedList &original) 
{ 
    first = last = curr = 0;  // (1) Attempt at a solution (Initialize "this") 
    /* this->~LinkedList(); */  // (2) Produces Crash 
    CopyList(original);   // (3) Without (1) Produces Crash 

    return; 
} 
+0

注意:在'LinkedList'中聲明'Node'子類後,你缺少一個分號。而'DataInsert'沒有返回類型,這是標準兼容C++所必需的。您應該修復* *或發佈*真實代碼*。 – WhozCraig

回答

1
  1. 你剛纔宣佈destructor~LinkedList();。理想情況下,你應該定義它,並應該在那裏寫一些delete代碼來釋放一些內存。或者將定義留爲~LinkedList() { }。這就是(2)產生崩潰的原因。

  2. 你應該有一個default constructor或其他方式來初始化指針。如果在沒有初始化的情況下使用指針,那麼缺少這一步會產生一個異常。

  3. 正如在WhozCraig的評論中已經提到的那樣,struct的定義應該以; - 以分號結尾。

  4. 你打電話InsertData()和你班上的功能是DataInsert()。這是一個錯字嗎?

相關問題