c ++创建新的LinkedList类:释放的Clear()方法指针未分配

时间:2013-12-30 03:56:58

标签: c++ linked-list

我尝试创建一个新的链表类。 代码工作&运行正常,但仍然有一些错误消息。

我知道问题位于LinkedList :: Clear();方法。

我做了2个指针

P“用于定位和删除(删除p;),

和“savecurrent”找到下一步删除的位置;

错误信息

HelloWorld(25850,0x7fff72537310) malloc: *** error for object 0x100b01030: 
pointer being      freed was not allocated
*** set a breakpoint in malloc_error_break to debug
The program has unexpectedly finished.

继承代码

#include "linkedlist.h"
#include "strlib.h"
#include <string>


LinkedList::LinkedList(){
      x_front = NULL;
      x_size =0;
   }

 LinkedList::~LinkedList() {
       ListNode*p = x_front;
       ListNode*savecurrent = x_front;
       for(p ; p != NULL ; p = savecurrent){
            savecurrent = savecurrent->next;
           delete  p;
       }
 }



void LinkedList::add(int value){
               if(x_front == NULL){
                   x_front = new ListNode(value,NULL);
                     }
               else {
                    ListNode *current = x_front;
                    while(current-> next != NULL){
                       current = current -> next;
                        }
                    current->next = new ListNode(value,NULL);
               }
     x_size++;
}


 void LinkedList::clear(){
         ListNode*p = x_front;
         ListNode*savecurrent = x_front;
         for(p ; p != NULL ; p = savecurrent){
                   savecurrent = savecurrent->next;
                   delete p;
                   x_size --;
         }
 }

 string LinkedList::toString() const{
                     string mystring;
                     for(ListNode*p=x_front;p!=NULL;p=p->next){
                     mystring = mystring + " " + integerToString(p->value);
                     }
                     return mystring;
 }


int LinkedList::size() const{
         return x_size;
 } 

标题.h

#ifndef LINKEDLIST_H
#define LINKEDLIST_H

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

struct ListNode{
     int value;
     ListNode* next;

     ListNode(int d,ListNode *n){
         value = d;
         next = n;
     }
 };

 class LinkedList
 {
 public :
     LinkedList();
     ~LinkedList();
     void add(int value);
     void clear();
     int get(int index) const;
     bool isEmpty() const;
     void remove(int index);
     int size() const;
     string toString() const;

 private :
     ListNode* x_front;
     int x_size;
 };

 #endif // LINKEDLIST_H

2 个答案:

答案 0 :(得分:2)

您正在分配单个对象(例如new ListNode(value,NULL)),但您正在删除数组对象,例如delete[] p。分配的形式必须完全是解除分配的形式。尝试从[]表达式中删除delete

答案 1 :(得分:0)

使用new时的经验法则 对于每个new,应该有delete,而对于每个new [],应该有delete []

而且,为什么要清理destructor中的所有节点以及已在clear()例程中完成的节点。保留其中任何一个。

一个建议是在销毁后将节点指针分配给NULL。这样可以防止双重删除。