2012-04-12 11 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フォルトが発生しています。なぜこれがどのようになっているのか、それをどう修正するのかについての洞察は高く評価されます。ここに私のSortedListのデストラクタがあるセグメンテーションフォールトC++

/* 
* 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() 'を呼び出す必要がありますので、デストラクタは何もしませんか? –

+0

あなたがそれを見て気にするならば、私はSortedListデストラクタを1分で投稿します。 –

+0

それでは、 'SortedList :: freeList'から' delete tmp-> next; '行を削除することです。ソートされたリストがそれに渡されたすべてのストレージを所有していると仮定していますか? 'student'が指すスペースを所有していない場合、' delete tmp-> student; 'はおそらく正しくありません。 SortedList :: removeが何をするのかははっきりしない。それはListNodeを削除しますか、それともListNodeを削除して 'student'メンバを削除しますか? 'student'メンバーも削除すると、' SortedList :: freeList'と一貫性があります。それ以外の場合はそうではありません。 – gbulmer

答えて

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

+0

これは動作しますが、反復的に横断できるデータ構造のためにかなりのスタック領域を焼き付けます。 SortedList :: freeList(Listnode * L)のエラーは、同じスペースを2回だけ削除することにあります。 – gbulmer

4

まあ、我々はSortedListまたはStudentを見ることができない、と私は問題が1であると思いたい:ワンセグ障害が間違いなくdelete list;ライン

UPDATE 1によって引き起こされますそれらのnumは、作成ループの後に元の値にリセットされないことに注意してください。つまり、removeコールの大部分は、Studentに属するIDを渡すことになります。おそらくその場合は失敗します。あるいは、おそらく、insertまたはremoveのメソッド、またはコンストラクタまたはデストラクタのバグがあります。それは完全に空中にある。

編集:他の人が指摘しているように、そのデストラクタは削除された後にポインタを使います。それが唯一のエラーの原因となる可能性があります。また、まだ見ていないコードのほうが簡単かもしれません。

+0

OPは彼の質問を更新しました。 – karlphillip

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番号(100000 + BOUNDS * 10 + i * 10)から学生が削除されません。 IDで削除する予定だった場合は、removeループを実行する前にnumを100000にリセットすることを検討する必要があります。

seg-faultがどのように発生する可能性があるかを明確にする:remove関数が適切な境界チェックをしていない場合、削除する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

ya申し訳ありませんが、私はそれを修正しました –

関連する問題