2017-05-19 7 views
1

リンクリストを書きましたが、すべて正常に機能しますが、特定の関数を使用して印刷しようとしたときにエラーが発生しました。エラーとそれを修正する方法がありますか?C++ - リンクされたリスト - 私が使用するときにプログラムの中断 - >印刷機能で

エラーは、ReverseNew-> print();を呼び出したときにのみ発生します。

(main.cppにで)関数reverseList:メイン

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

インサイド(標準ライブラリのスマートポインタstd::unique_ptrstd::shared_ptr/std::weak_ptrをチェックアウト)機能で動的割り当てを使用しますreverseList(List & listToReverse)関数の本体では、変数newListを作成します。これはスコープ外になり、関数の実行が終了すると破棄されます。コードで後でその変数を参照しようとすると、既に削除されたものを参照しようとするため、未定義の動作が発生します。 newListを代わりにこれを修正するためのポインタにしてください(スマートポインタ)。

0

あなたは機能の一部を削除すると、問題を見て簡単にする必要があります:

List * reverseList(List &listToReverse){ 

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

ローカル変数のアドレスを返します。それは未定義の行動(UB)です。 は、2つのソリューションを持ってこの問題を解決するには、次のオブジェクトのコピーを返します(浅いコピー問題には注意してください)、または

関連する問題