为什么我遇到此代码的分段错误?此代码几乎没有运行,因此构造函数或复制构造函数中可能存在错误

Why am i getting a segmentation fault with this code? This code is barely running so there's probably an error in the constructor or copy constructor

本文关键字:代码 错误 构造函数 复制 存在 几乎没有 遇到 分段 运行 为什么      更新时间:2023-10-16

我不断收到此代码的分段错误。我不明白为什么。构造函数/析构函数中是否存在一些明显的错误,或者我使用指针的方式是否存在问题?

template <class T>
LinkedList<T>::LinkedList()
{
 head=NULL;
}

复制构造函数

template <class T>
LinkedList<T>::LinkedList(const LinkedList<T>& otherLinkedList)
{
                        head= new ListItem<T> (NULL);
                        ListItem<T>* temp;
                        ListItem<T>* writeto;
                        temp=otherLinkedList.getHead();
                        writeto=head;
                        while (temp->next != NULL)
                                {
                                writeto->value=temp->value;
                                temp=temp->next;
                                writeto=writeto->next;
                                writeto= new ListItem<T> (NULL);
                                }
                        writeto=NULL;
                        ListItem<T>* pre;
                        pre=writeto;
                        while (pre->prev != head)
                                {
                                pre=pre->prev;
                                writeto->prev=pre;              /
                                }

}

破坏者

template <class T>
LinkedList<T>::~LinkedList()
{
ListItem <T> *temp;
                temp=head;
                while (temp->next != NULL)
                        {
                        temp=temp->next;
                        delete temp->prev;
                        }
                delete temp;
                delete head;
}

在链表的头部插入新节点

template <class T>
void LinkedList<T>::insertAtHead(T item)
{
    ListItem <T> *newnode= new ListItem <T>(item);
                if(head==NULL)
                {
                head=newnode;newnode->next=NULL;
                }
                {
                newnode->next=head;
                head->prev=newnode;
                head=newnode;
                }

}
// INSERTS NEW NODE AT TAIL OF LIST
template <class T>
void LinkedList<T>::insertAtTail(T item)
{
 ListItem <T> *newnode;
 newnode = new ListItem <T> (item);
                //newnode->value=item;
                if(head==NULL)
                {
                head=newnode;
                newnode->next=NULL;
                }
                {
                ListItem <T> *here=head;
                while (here->next != NULL)
                {
                        here=here->next;
                }
                here->next= newnode;
                newnode->prev=here;
                newnode->next=NULL;             
                }
}
您需要

正确使用if/else

当你写:

if(head==NULL)
 {
    head=newnode;newnode->next=NULL;
 }
 {
   newnode->next=head;
   head->prev=newnode;
   head=newnode;
 }

如果出现head == NULL,两个块都将被激活。

你应该使用 else,像这样:

if(head==NULL)
 {
    head=newnode;newnode->next=NULL;
 }
 else
 {
   newnode->next=head;
   head->prev=newnode;
   head=newnode;
 }
  1. 在您的复制构造函数中,如果otherLinkedList.getHead()返回NULL怎么办?这会将temp设置为NULL,取消引用NULL将是未定义的行为。这意味着您刚刚创建了一个空链表并尝试从中复制。
  2. 另一种可能性是,在析构函数中,如果列表为空或列表只有一个元素,则delete head将尝试删除对象 2 次,这可能会导致错误