C++ 分段故障C++;

C++ 分段故障C++;,c++,segmentation-fault,C++,Segmentation Fault,嗯,我们看不到分类列表或学生,我猜问题出在其中一个。我注意到在创建循环之后,num永远不会重置为其原始值,这意味着大多数remove调用将传递一个属于noStudent的id;也许这个案子失败了。或者可能在insert或remove方法中,或者在构造函数或析构函数中存在一些bug。这完全是悬而未决的 编辑:正如其他人指出的,析构函数在被删除后使用指针;这可能是唯一的错误来源,或者我们还没有看到的代码中很容易有更多的错误。好吧,我们看不到SortedList或Student,我猜问题出在其中一个代

嗯,我们看不到
分类列表
学生
,我猜问题出在其中一个。我注意到在创建循环之后,
num
永远不会重置为其原始值,这意味着大多数
remove
调用将传递一个属于no
Student
的id;也许这个案子失败了。或者可能在
insert
remove
方法中,或者在构造函数或析构函数中存在一些bug。这完全是悬而未决的


编辑:正如其他人指出的,析构函数在被删除后使用指针;这可能是唯一的错误来源,或者我们还没有看到的代码中很容易有更多的错误。

好吧,我们看不到
SortedList
Student
,我猜问题出在其中一个代码中。我注意到在创建循环之后,
num
永远不会重置为其原始值,这意味着大多数
remove
调用将传递一个属于no
Student
的id;也许这个案子失败了。或者可能在
insert
remove
方法中,或者在构造函数或析构函数中存在一些bug。这完全是悬而未决的

/*
 * Destructs this sorted list object
 */
SortedList::~SortedList() {
    freeList(head);
}

/*
 * Traverses throught the linked list and deallocates each node
 */
void SortedList::freeList(Listnode *L) {
    Listnode *tmp = L;  //holds the node to be deleted

    //traverses the list
    while (tmp != NULL) {
        Listnode *next = tmp->next; //holds the value of the next node

    //delete previous node
    delete tmp->student;
    delete tmp->next;
    delete tmp;

    //sets the next node to the node to be deleted
    tmp = next;
    }
    //delete header node
    delete L;
}
编辑:正如其他人指出的,析构函数在被删除后使用指针;这可能是唯一的错误源,或者我们还没有看到的代码中可能有更多错误。

freelist()
中,删除
tmp->next
,然后设置
tmp=tmp->next
。现在
tmp
的指针无效。您需要重新构造代码,以便在访问指针的成员之前不会释放指针

/*
 * Destructs this sorted list object
 */
SortedList::~SortedList() {
    freeList(head);
}

/*
 * Traverses throught the linked list and deallocates each node
 */
void SortedList::freeList(Listnode *L) {
    Listnode *tmp = L;  //holds the node to be deleted

    //traverses the list
    while (tmp != NULL) {
        Listnode *next = tmp->next; //holds the value of the next node

    //delete previous node
    delete tmp->student;
    delete tmp->next;
    delete tmp;

    //sets the next node to the node to be deleted
    tmp = next;
    }
    //delete header node
    delete L;
}
虽然我讨厌为别人做家庭作业,但我的解决办法是:

void SortedList::freeList(Listnode *L) {
    Listnode *tmp = L;  //holds the node to be deleted

    //traverses the list
    while (tmp != NULL) {
        Listnode *next = tmp->next; //holds the value of the next node

    //delete previous node
    delete tmp->student;
    delete tmp->next;
    delete tmp;

    //sets the next node to the node to be deleted
    //**********
    //Check here, you deleted next, but the assigned it to temp.  Tmp isn't null, but           
    //it is however, no longer your memory (since you deleted it)
    //**********
    tmp = next;
    }
    //delete header node
    delete L;
}
这将使用O(n)堆栈空间进行删除,但我个人发现它比循环更清晰。通过删除
freelist()
中对
delete tmp->next

的调用,可以将您的解决方案调整为“只工作”,您可以删除
tmp->next
,然后设置
tmp=tmp->next
。现在
tmp
的指针无效。您需要重新构造代码,以便在访问指针的成员之前不会释放指针

虽然我讨厌为别人做家庭作业,但我的解决办法是:

void SortedList::freeList(Listnode *L) {
    Listnode *tmp = L;  //holds the node to be deleted

    //traverses the list
    while (tmp != NULL) {
        Listnode *next = tmp->next; //holds the value of the next node

    //delete previous node
    delete tmp->student;
    delete tmp->next;
    delete tmp;

    //sets the next node to the node to be deleted
    //**********
    //Check here, you deleted next, but the assigned it to temp.  Tmp isn't null, but           
    //it is however, no longer your memory (since you deleted it)
    //**********
    tmp = next;
    }
    //delete header node
    delete L;
}

这将使用O(n)堆栈空间进行删除,但我个人发现它比循环更清晰。您的解决方案可以通过删除对
delete tmp->next

delete list
的调用来调整为“正常工作”,因为它应该调用
~SortedList()
,所以析构函数是否做了一些不寻常的事情呢?我将在一分钟内发布SortedList析构函数,如果你想看的话,一个修正是删除行
deletetettmp->next来自
SortedList::freeList
。是否假定SortedList拥有交给它的所有存储?如果它不拥有
student
指向的空间,则
删除tmp->student可能不正确。尚不清楚SortedList::remove的作用。这是删除ListNode,还是删除ListNode并删除
学生成员?如果它也删除了
student
成员,那么它将与
SortedList::freeList
一致,否则它就不一致了。
delete list
应该调用
~SortedList()
,那么析构函数做了什么不寻常的事情吗?我将在一分钟后发布SortedList析构函数,如果你想看的话,一个修正是删除行
deletetettmp->next来自
SortedList::freeList
。是否假定SortedList拥有交给它的所有存储?如果它不拥有
student
指向的空间,则
删除tmp->student可能不正确。尚不清楚SortedList::remove的作用。这是删除ListNode,还是删除ListNode并删除
学生成员?如果它也删除了
student
成员,那么它将与
SortedList::freeList
保持一致,否则它不是。+1简单的freeList()过程。在您阅读最后一条评论后,我将删除我的答案。虽然这样做有效,但对于可以迭代遍历的数据结构,它会消耗大量堆栈空间。SortedList::freeList(Listnode*L)中的错误在于只删除相同的空间两次。+1简单的freeList()过程。在您阅读最后一条评论后,我将删除我的答案。虽然这样做有效,但对于可以迭代遍历的数据结构,它会消耗大量堆栈空间。SortedList::freeList(Listnode*L)中的错误在于仅删除相同的空间两次。
/*
 * Traverses throught the linked list and deallocates each node
 */
void SortedList::freeList(Listnode *L) {
    if(L == NULL) return;
    freeList(L->next);
    delete L->student;
    delete L;
}