程序接收到SIGABRT信号,已中止

7

我的程序中有一个结构

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;
    }
}
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的变量,代码如下:

List* add;
add = new List;

但是第二行仍然有同样的问题。如何正确重新编写?还需要在此处粘贴调用addL函数的代码吗?如果这个问题已经被问过了,对不起,我在查看时没有理解。


我们无法从中得知你的错误。你的testcase在哪里? - Lightness Races in Orbit
1个回答

5

可能是你的内存不足(也许你的列表对于你的内存来说太大了),或者你正在尝试访问不允许的内存区域。


由于列表很小,所以我怀疑这是问题所在(如此处所述):

abort()通常由检测到内部错误或某些严重破坏约束的库函数调用。例如,如果堆溢出破坏了其内部结构,则malloc()会调用abort()

另一个相关的问题在这里

因此,我建议你拿一张纸和笔,画出你的代码在做什么。可能存在指针交错或其他问题。


有一个小列表(共8个元素) - Tami
1
编辑@Tami。看起来你那里有一个内存错误!你的函数在我看来是没问题的。顺便说一句,好问题,加一。 - gsamaras
谢谢,我会再仔细检查所有的代码,因为有很多指针可能会出错。 - Tami

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接