2015-04-05 53 views
4

有一個在我的程序計劃,中止

struct List  
{ 
    int data; 
    List *next; 
}; 

的結構和添加元素到列表的尾部的功能:

void addL(List* &tail, int dat) 
{ 

    if (tail==NULL) 
    { 
     tail = new List; 
     tail->data = dat; 
     tail->next=NULL; 
    } 
    else 
    { 
     tail->next = new List; 
     tail = tail->next; 
     tail->data = dat; 
     tail->next = NULL; 
    } 
} 

GDB說,關於這個問題

terminate called after throwing an instance of 'St9bad_alloc' 
    what(): std::bad_alloc 

Program received signal SIGABRT, Aborted. 
0xb7fdd424 in __kernel_vsyscall() 

符合

tail->next = new List; 

我試圖使像這種類型的列表的另一個變量:

List* add; 
add = new List; 

但在第二行有同樣的問題。

如何正確重寫?是否需要在這裏粘貼調用addL的函數? 對不起,如果這個問題已經被問到,我無法理解,而通過他們看。

+0

我們不知道你做錯了什麼。你的[testcase](http://sscce.org)在哪裏? – 2015-04-05 17:26:07

回答

1

要麼你內存不足(可能你的列表太大,不適合你的內存),或者你正在嘗試內存中某處不允許的地方。


由於列表很小,那麼我懷疑這是問題(如規定here):

abort()通常是由庫函數,其檢測內部錯誤或嚴重損壞的約束調用。例如,如果malloc()的內部結構被堆溢出損壞,則它將調用abort()

另一個相關的問題在於here

所以我建議你拿一張紙和一支筆畫出你的代碼所做的事情。有可能是一個糾結的指針或其他東西。

+0

有一個小列表(8個元素) – Tami 2015-04-05 17:16:58

+0

編輯@Tami。似乎你有一個內存錯誤!你的功能對我來說很好。很好的問題btw,+1。 – gsamaras 2015-04-05 17:33:51

+0

謝謝,我會再一次忽略所有的代碼,因爲有很多指針,可能會出現錯誤 – Tami 2015-04-05 17:39:00