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