-3

わかった。私は単純なリンクリストコードで支払いをしています。

ヘッド ノードをパブリックとして保持します。次に、メイン プログラムで最初のリスト (first) のヘッド ノードを格納するポインター (head2) を宣言します。second という 2 番目のリストを宣言し、head2 を 2 番目のリストのヘッド ノードとして割り当てます。次に、head2 を削除します。次に、"second" (ヘッド ノードが削除された) のメンバーにアクセスし、それらを出力します。セグメンテーション違反が予想されました。しかし、それは機能し、ヘッドノードのデータに対してのみ 0 を出力します。私が困惑しているのは、ヘッド ノードが削除された場合、ヘッド ノードの次のポインターがメモリ内に残っていることです。(これは、リストをトラバースするために print によってアクセスされます。Ubuntu で g++ 4.6.1 を使用しています。コードは次のとおりです。

#include<iostream>

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

class list1
{
public:
    list1();
    Node* head;
    void insert(int);
    void print();
};

list1::list1()
{
    head=NULL;
}

void list1::insert(int a)
{
    Node* newnode=new Node;
    newnode->data=a;
    newnode->next=head;
    head=newnode;
}

void list1::print()
{
    Node* dummy=head;
    while(dummy)
    {
        std::cout<<dummy->data<<std::endl;
        dummy=dummy->next;
    }
}

int main()
{
    list1 first;
    first.insert(1);
    first.insert(2);
    first.insert(4);
    first.insert(9);

    list1 second;
    Node* head2=new Node;
    head2=first.head;
    second.head=head2;
    delete head2;
    second.print();
    return 0;
}
4

2 に答える 2

2

あなたのコードは、有効期間が終了したオブジェクトにアクセスすることによって、未定義の動作を呼び出します。

それがまだ機能するかもしれないことは何も奇妙なことではありません。

未定義の動作とは、観察しているものを含め、何かが起こる可能性があることを意味します。

于 2013-03-27T03:08:55.240 に答える
1

メモリの削除は、メモリをシステムに戻すことを意味し、返されたメモリは再度割り当てる準備ができています。ただし、メモリが上書きされるまで、メモリ内のデータはそのまま残ります。あなたのプログラムはメモリを削除したので、あなたのプログラムはいつ、誰がメモリブロックを再び割り当てるかわかりません。したがって、プログラムにとって、メモリを引き続き使用すると、未定義の動作が発生します。

于 2013-03-27T03:12:52.960 に答える