2017-03-25 16 views
0

プログラムが実行され、テストが成功しますが、リストとテスト結果の間に次のような結果が表示されます。assignment_2.2(10729,0x7fff78db0300)malloc:*オブジェクト0x7fb132d00000:pointerのエラー解放されていませんでした *は、デバッグするためにmalloc_error_breakにブレークポイントを設定しました これをどのように修正できますか?円形リンクリストのメモリエラー

main.cppに

#include "OLinkedList.h" 

using namespace std; 

int main(int argc, char** argv) { 
    OLinkedList CircleList; 
    CircleList.fillList(0); 
    CircleList.prntList(); 
    CircleList.OTest(); 
    return 0; 
} 

OLinkedList.h

#ifndef OLINKEDLIST_H 
#define OLINKEDLIST_H 

#include <iostream> 
#include <iomanip> 
using namespace std; 

class OLinkedList{ 
private: struct Link{ 
       int data; 
       Link *next; 
      }; 
      Link *head; 
      Link *tail; 
public:  OLinkedList(){head = nullptr; tail = nullptr;}; 
      ~OLinkedList(); 
     void fillList(int); 
     void prntList(); 
     void OTest(); 

}; 

//Destructor for Class used to delete memory of list 
OLinkedList::~OLinkedList(){ 
    Link *linkPtr = head; 
    Link *nextPtr; 

    //traverses to the end of the list to delete memory 
    do 
    { 
     nextPtr = linkPtr->next; 
     delete linkPtr; 
     linkPtr = nextPtr; 
    }while(linkPtr!= nullptr); 
} 

// 
void OLinkedList::fillList(int size){  
    Link *front = new Link; //create first link 
    head = front; //set first link = to traversal 
    head->data = size++;   //Fill the front with data 
    head->next = nullptr;  //Point the front to no where 

    Link *temp = head;  
    do{ 
     Link *end = new Link; //Create a new link 
     end->data = size++;  //Fill with data 
     end->next = nullptr;  //Point to no where 
     temp->next=end;//Previous link will point to the end 
     temp=end; //Now this has become previous link 
     tail = end; 
     tail->next = head; 
    }while(size < 10);   //Repeat until filled 

} 

void OLinkedList::prntList(){ 
    Link *linkPtr; 

    linkPtr = head; 
    int i = 0; 
    do{ 
     cout<<" "<<setprecision(3)<<linkPtr->data; 
     linkPtr = linkPtr->next; 
     i++; 
    }while(i < 10); 
} 

//Used to prove list is circular 
void OLinkedList::OTest(){ 
    Link *linkPtr = tail->next; 
    cout<<"\nAfter "<<tail->data<<" is "<<linkPtr->data; 
} 
#endif /* OLINKEDLIST_H */ 

答えて

0

あなたがtail-を設定>頭の隣に、あなたが作成しています循環リンクリスト意図されました。あなたのdo whileループは頭の上で二重の自由をしているので、linkptr!= head、nullptrではなく、チェックする必要があります。これは、ポインタを削除しても以前ポインタを指し示していた変数は無効にならないため、ループは最終的に先頭に戻ります。

実際、ダブルフリーでない場合、コードは無限ループに入ります。