2015-04-05 48 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