2012-04-11 82 views
0

我得到一個「分段故障(核心轉儲)」運行時錯誤與下面的代碼:段錯誤C++

#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]); 

    // individually deletes each student 
    num = 100000; 
    for (int i = 0; i < BOUNDS; i++) { 
     delete list->find(num); 
    num += 10; 
    } 

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

    num = 100000; 
    for (int i = 0; i < BOUNDS; i++) { 
    list->remove(num); 
    num += 10; 
    } 

    cout << "test2" << endl; 
    delete list; 
    return 0; 
} 

我已經縮小誤差下降到delete list;線(或哪一個至上)。我只是想知道這是爲什麼,以及如何解決它。任何關於這個問題的見解都是有用的。

+1

你似乎在unixoid系統上運行這個。所以使用Valgrind;) – 0xC0000022L 2012-04-11 23:29:16

+2

「//填充100名具有各種ID號的學生的數組」這個循環不會做這個評論所說的話。 – 2012-04-11 23:29:23

+1

作爲參考,每次有人用'namespace std;'來命名',我就踢一隻小狗。在再次做這件事之前想想可憐的小狗。 – cHao 2012-04-11 23:31:35

回答

1

你有兩個問題,我可以看到。

首先,在這個循環:

for (int i = 0; i < BOUNDS; i++) { 
    x = new Student(num); 
    num += 10; 
} 

您正在創建一堆動態Student S和把最新的一個在x和前一丟失。這將動態創建100 Student,其中99個被泄露。它也不會像上面說的註釋那樣填滿Student。我不確定你要在這裏做什麼,所以我不能評論你需要做什麼。

其次,你在這裏呼籲delete

delete list->find(num); 

Student S中的自動存儲(棧)(因爲你在create充滿指針指向Student是清單持有自動Student小號),這會導致未定義的行爲,並可能是您的段錯誤的原因。您不需要取消分配這些Student,因爲當數組在main的末尾超出範圍時它們將被釋放。

0

你肯定泄漏內存:

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

x在這個片段中被泄露,除非Student的構造函數不知何故神奇地插入自己的地方,那裏的指針可跟蹤。

而這可能或可能與墜機有關。

+0

'num'不被用作任何數組的索引,所以'num/10> NBOUND'並不重要。另外,delete不是「刪除未初始化的對象」,而是「刪除」未動態分配的對象,這會產生未定義的行爲。 – 2012-04-11 23:37:30

+0

對不起,你仍然有兩個錯誤的註釋:'// ERROR:'create'not initialized'(如果它們不是內置類型,則初始化數組中的對象)和'ERROR:刪除未初始化的對象(可能不是0 )'這是錯誤的,因爲我上面所說的。 – 2012-04-11 23:40:23

+0

你在使用什麼C++編譯器?這是不正確的。在任何時候都沒有代碼,初始化'create'和堆棧變量的內容不會自動初始化,因爲您似乎堅持。我想知道你指的是什麼C++標準,因爲這是我第一次聽到這個...... – 0xC0000022L 2012-04-11 23:58:01

0

不知道如何StudentList實現,這是一種拍攝的黑暗,但...

list->insert(&create[i]);被添加堆棧中分配對象添加到列表,然後delete list->find(num);試圖刪除這個堆棧中分配對象。您不能delete堆棧分配的對象。

除此之外,您的第一個for循環正在泄漏內存。

而我一直在忍者。

0

此行有一個問題:

list->insert(&create[i]); 

在這一點上,create已經分配,​​但沒有已經投入它。應該在那裏指定x = new Student(num)的結果。

0

「創建」數組在堆棧上分配。你正試圖刪除堆棧分配的內存,這就是爲什麼你得到這個錯誤。

delete list-> find(num);