web-dev-qa-db-ja.com

プログラム受信信号SIGABRT、中止

私のプログラムには構造があります

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型の別の変数を作成しようとしました。

List* add;
add = new List;

しかし、2行目でも同じ問題が発生しました。

これを正しく書き直す方法は?そして、addLを呼び出す関数をここに貼り付ける必要はありますか?申し訳ありませんが、この質問がすでに行われている場合は、それらを調べている間、私は理解できませんでした。

5
Tami

メモリが不足している(リストがメモリに対して大きすぎる可能性があります)か、メモリ内の許可されていない場所で試行しています。


リストが小さいので、これが問題だと思います(述べたように ここ ):

abort()は通常、内部エラーまたは深刻に壊れた制約を検出するライブラリ関数によって呼び出されます。たとえば、malloc()はその内部構造がヒープオーバーフローによって損傷した場合にabort()を呼び出します。

もう1つの関連する質問は ここ です。

ですから、紙とペンを持って、コードの機能を描くことをお勧めします。おそらくタングリングポインタか何かがあります。

2
gsamaras