2017-05-19 73 views
1

我寫了一個鏈表,一切正常,但當我嘗試使用特定功能並打印它時,我收到一個錯誤,我會很樂意幫助爲什麼我是否收到錯誤以及如何解決它。C++ - 鏈接列表 - 當我使用打印功能時,程序中斷 - >在打印功能

只有當我調用ReverseNew-> print();

功能reverseList(在main.cpp中):

List * reverseList(List &listToReverse){ 

List newList; 
Node* currentPtr = listToReverse.getFirstNode(); 

while (currentPtr != 0){ 
    newList.AddElement(currentPtr->getdata()); 
    currentPtr = currentPtr->getNextPtr(); 
} 

Node* currentNode = newList.getFirstNode(); 
int size = newList.size(); 
while (currentNode != 0){ 
    currentNode->setId(size); 
    size--; 
    currentNode = currentNode->getNextPtr(); 
} 
return &newList; 
} 

主:

int main(){ 

List l1; 
l1.AddElement(1); 
l1.AddElement(2); 
l1.AddElement(3); 
**l1.print(); >> Here he prints the list and works fine** 

List* reverseNew = reverseList(l1); 
**reverseNew->print(); >> here the program break** 

system("pause"); 
return 0; 
} 

打印功能:(在List.cpp)

void List::print(){ 
Node* currentNode = firstPtr; 

if (isEmpty()) 
    std::cout << "List is empty" << std::endl; 
else{ 
    while (currentNode != 0){ 
     std::cout << " < " << currentNode->data << " , " << currentNode->ID 
<< " > " << std::endl; 
     currentNode = currentNode->nextPtr; 
    }}} 

當程序出來她把我帶到這一行:(在打印功能中)

std::cout << " < " << currentNode->data << " , " << currentNode->ID 
<< " > " << std::endl; 

thabk's。

回答

1

reverseList(列表& listToReverse)函數體,您創建一個變量newList超出範圍並在函數結束執行後被銷燬。當您在代碼中稍後嘗試引用該變量時,會導致未定義的行爲,因爲您嘗試引用已被刪除的內容。讓newList一個指針,而不是修復這個(或更好的,一個智能指針)。

0

一旦你刪除功能的一部分,它應該是更容易看到問題:

List * reverseList(List &listToReverse){ 

    List newList; 
    // ... 
    return &newList; 
} 

你返回一個局部變量的地址。這是一個未定義的行爲(UB)。 爲了解決這個問題有兩種解決方案:返回對象的一個​​副本(提防淺拷貝問題),或在功能使用動態分配(檢查標準庫智能指針std::unique_ptrstd::shared_ptr/std::weak_ptr