2013-09-26 66 views
0

我正在嘗試使用節點爲我的隊列(FIFO)執行深層複製,並且出現錯誤並且不知道是什麼導致了它。所有的方法工作正常,當我不復制任何東西,但只要我試圖複製我得到一個「MyQueue.exe」停止工作。這種情況發生在我甚至不使用這些方法時。即使我評論整個do-while循環,它也會發生。任何人都知道這是什麼原因?使用節點的深度複製隊列運行時錯誤

MyQueue::MyQueue (void) 
{ 
    head = NULL; 
    queueSize = 0; 
} 

MyQueue::MyQueue (const MyQueue & myq) 
{ 
    copyQueue (myq); 

} 

MyQueue & MyQueue::operator = (const MyQueue & myq) 
{ 

    copyQueue (myq); 
    return *this; 

} 

void MyQueue::copyQueue (const MyQueue & myq) 
{ 
    head = NULL; 
    queueSize = 0; 
    Node* temp = myq.head->next; 
    do 
    { 
     enqueue(myq.head->data); 
     temp = temp->next; 
    } 
    while (temp->next != NULL); 

} 

MyQueue::~MyQueue (void) 
{ 

} 

void MyQueue::enqueue (const int n) 
{ 
    Node* temp = tail; 
    tail = new Node (n); 
    queueSize++; 
    if (empty()) 
    { 
     head = tail; 

    } 
    else 
    { 

     temp->next = tail; 

    } 

} 

int MyQueue::dequeue (void) 
{ 
    if (!empty()) 
    { 
     int result = head->data; 
     Node* temporary = head; 
     head = (temporary->data, temporary->next); 
     queueSize--; 
     return result; 

    } 
    else 
    { 
     std::cout << "No Items to remove" << std::endl; 
     return NULL; 
    } 

} 

int MyQueue::peek (void) 
{ 
    return head->data; 
} 



bool MyQueue::empty (void) 
{ 
    if (head == NULL || queueSize == 0) 
    { 
     return true; 
    } 

    return false; 
} 

這是我的節點是如何複製

Node & Node::operator = (const Node* & nd) 
     { 
      data = nd->data; 
      next = nd->next; 
     } 
+0

想問一個[最小完整示例](http://sscce.org)是否太多了? – Beta

+0

您的代碼存在多個問題。您的「節點」分配不是深度分配。您的'copyQueue()'多次複製輸入隊列的第一個元素,而不是複製每個隊列成員。你的'dequeue()'不會刪除在'enqueue()'中分配的內存。您的崩潰可能是由於'copyQueue()'方法的'while'條件導致的NULL解引用。 – jxh

回答

0
MyQueue q1; 
MyQueue q2 = q1; // Crash. 

這會崩潰,因爲head是空的,你取消對它的引用在copyQueue()方法。

Node* temp = myq.head->next;