这是节点的声明。
template <typename E> class Link {
private:
static Link<E>* freelist;
public:
E element;
Link* prev;
Link* next;
Link(const E& it, Link* prevp, Link* nextp) {
element = it;
prev = prevp;
next = nextp;
}
Link(Link* prevp = NULL, Link* nextp = NULL) {
prev = prevp;
nextp = nextp;
}
void* operator new(size_t) {
if(freelist == NULL)
return ::new Link;
Link<E>* temp = freelist;
freelist = freelist->next;
return temp;
}
void operator delete(void* ptr) {
((Link<E>*) ptr)->next = freelist;
freelist = (Link<E>*)ptr;
}
};
template <typename E>
Link<E>* Link<E>::freelist = NULL;
ADT类列表继承了类TwoWayList。而且我敢肯定,该问题与ADT无关。
这是TwoWayList类的声明,我只是选择一些我认为可能导致该问题的段。
template <typename E> class TwoWayList :public List<E> {
private:
Link <E>* head;
Link <E>* tail;
Link <E>* curr;
int cnt;
void init(){
curr=tail=head=new Link<E>;
cnt=0;
}
void removeall(){
while(head!=NULL){
curr=head;
head=head->next;
delete curr;
}
}
public:
void append(const E& it) {
tail->prev = tail->prev->next = new Link<E>(it, tail->prev, tail);
cnt++;
}
这是主要功能
int main(){
TwoWayList<int> l;
l.append(1);
l.append(2);
l.append(3);
l.append(4);
l.append(5);
}
每当我运行这句话tail->prev = tail->prev->next = new Link<E>(it, tail->prev, tail);
时,就会弹出一个窗口,说Program received signal SIGSEGV, Segmentation fault
答案 0 :(得分:1)
您的构造函数应与该类具有相同的名称,而不是与init()相同,后者将正确设置指针,从而不会发生sigfault。
同样,您将需要在解构函数中重新分配所有内容,以防止内存泄漏。