簡體   English   中英

循環鏈接列表時發生內存錯誤:未分配要釋放的指針

[英]Memory Error with Circularly Linked List: pointer being freed was not allocated

程序運行並且測試確實成功,但是在列表和測試結果之間,我得到了這個:Assignment_2.2(10729,0x7fff78db0300)malloc: *對象0x7fb132d00000錯誤:未分配指針*在以下位置設置斷點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 */

當將tail-> next設置為head時,將按預期創建循環鏈接列表。 您的do while循環應檢查linkPtr!= head,而不是nullptr,因為您正在執行head free的雙重操作。 這是因為刪除指針不會使以前指向它的任何變量無效,因此您的循環最終將返回head。

實際上,如果沒有雙重釋放,您的代碼將陷入無限循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM