2012-04-12 132 views
1
#include <iostream> 
#include "Student.h" 
#include "SortedList.h" 

using namespace std; 

#define BOUNDS 100 

int main() { 

    SortedList *list = new SortedList(); // points to the sorted list object 
    Student *create[BOUNDS]; // array to hold 100 student objects 
    int num = 100000; // holds different ID numbers 

    // fills an array with 100 students of various ID numbers 
    for (int i = 0; i < BOUNDS; i++) { 
     create[i] = new Student(num); 
     num += 10; 
    } 

    // insert all students into the sorted list 
    for (int i = 0; i < BOUNDS; i++) 
    list->insert(create[i]); 

    // removes each student from the list 
    num = 100000; 
    for (int i = 0; i < BOUNDS; i++) { 
    list->remove(num); 
    num += 10; 
    } 

    delete list; 
    return 0; 
} 

我得到一个seg错误与以前的代码。任何有关为什么这是或如何可能解决它的见解将不胜感激。赛格故障肯定是由delete list;线造成分段错误C++

更新1:这是我的排序列表析构函数

/* 
* 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; 
} 
+0

'delete list'应该调用'〜SortedList()',那么析构函数做什么都不平凡? – 2012-04-12 02:42:23

+0

我会在一分钟后发布SortedList析构函数,如果你关心它的话。 – 2012-04-12 02:44:21

+0

所以一个修正是从'SortedList :: freeList'中删除'delete tmp-> next;'行。是否SortedList拥有所有交给它的存储?如果它不拥有'student'指向的空间,那么'delete tmp-> student;'可能不正确。目前还不清楚SortedList :: remove的作用。这会删除ListNode,还是删除ListNode并删除'student'成员?如果它也删除'student'成员,那么它将与'SortedList :: freeList'一致,否则它不会。 – gbulmer 2012-04-12 03:44:33

回答

2

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

虽然我讨厌做人民的功课对于他们来说,这里是我的解决方案:

/* 
* 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; 
} 

这种使用O(N)为删除堆栈空间,但我个人觉得比一个循环清晰。您可以通过删除对delete tmp->next的呼叫来调整您的解决方案以“正常工作”。

+0

+1简单的freeList()程序。读完最后一条评论后,我会删除我的答案。 – karlphillip 2012-04-12 03:17:25

+0

尽管有效,但它为可迭代遍历的数据结构烧了很多堆栈空间。 SortedList :: freeList(Listnode * L)中的错误仅在两次删除相同的空间。 – gbulmer 2012-04-12 03:17:29

4

好了,我们无法看到SortedListStudent,而且我想这个问题是在一个那些。我注意到num在创建循环之后永远不会重置为其原始值,这意味着大多数remove调用将被传递一个id,该编号属于no Student;也许那个案子失败了。或者,对于这个问题,在insertremove方法或者构造函数或析构函数中可能只有一些错误。它完全在空中。

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

+0

OP已更新他的问题。 – karlphillip 2012-04-12 03:07:36

1
// removes each student from the list 
    for (int i = 0; i < BOUNDS; i++) { 
    list->remove(num); 
    num += 10; 
    } 

看起来有趣...这是如何工作的?如果在代码中的这一点上num是100000 + BOUNDS * 10(因为它为你创建的每个学生添加10后永远不会改变)。每次删除您拨打的电话都不会删除学生的ID(因为所调用的ID是100000 + BOUNDS * 10 + i * 10)。是否意图通过ID删除它们,如果是这样的话,您应该考虑在执行删除循环之前将num重置为100000。

澄清如何这可能导致seg-fault:如果您的删除功能没有适当的边界检查它可能会出内存查找id删除。

更新与析构函数的问题:

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; 
} 
+0

对不起,我纠正了 – 2012-04-12 02:49:04