我尝试创建一个新的链表类。 代码工作&运行正常,但仍然有一些错误消息。
我知道问题位于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
答案 0 :(得分:2)
您正在分配单个对象(例如new ListNode(value,NULL)
),但您正在删除数组对象,例如delete[] p
。分配的形式必须完全是解除分配的形式。尝试从[]
表达式中删除delete
。
答案 1 :(得分:0)
使用new
时的经验法则
对于每个new
,应该有delete
,而对于每个new []
,应该有delete []
。
而且,为什么要清理destructor
中的所有节点以及已在clear()
例程中完成的节点。保留其中任何一个。
一个建议是在销毁后将节点指针分配给NULL
。这样可以防止双重删除。