0

以下をコーディングしました。挿入、先頭での削除、先頭と末尾への挿入はすべて正常に機能しています。太字でマークされたメモリは解放されません。cout<<tempエラーを与える必要がありますか?このコードの正確性についてコメントしてください。

void del(node** head)
{
    node* temp = (*head)->next;
    node* prev = *head;
    while(temp ->next!= NULL)
    {
        prev = temp;
        temp = temp -> next;
    }
    cout<<endl<<temp;
    cout<<endl<<prev;

    //delete prev ->next;
    prev -> next = 0;

    delete temp;
    cout<<endl<<"temp after free"<<temp;
    cout<<endl<<prev;
}
void main()
{
    node* head = NULL;  
int x = 5;
head = insert(head,x);
insert(head,6);
insert(head,7);
insert(head,8);
print(head);
del(&head);
print(head);
getch();    }

出力:

Empty List
|5| at 00673BF0
-------------------
|6| at 00673C30
-------------------
|7| at 00673FB8
-------------------
|8| at 00673FF8
-------------------

00673FF8
00673FB8
temp after free00673FF8
00673FB8

|5| at 00673BF0
-------------------
|6| at 00673C30
-------------------
|7| at 00673FB8
-------------------
4

3 に答える 3

2

deleteポインターの値を NULL に設定しませんが、ポイントされたメモリーは無効になります ( live は含まれませんnode)

これは、cout << tempがまだ持っているポインタの値を出力することを意味します (そして の前のノードのアドレスでしたdelete) が、逆参照temp(*tempまたは などtemp->next) は未定義の動作です

:delが指すポインタを変更する場所はどこにheadもないため、二重間接参照 ( node**) を必要としないか、新しいヘッドを に割り当てる必要があります*head

于 2012-06-18T18:59:45.343 に答える
1

Attila が既に指摘したように、ポインターを削除した後にポインターを逆参照するのは未定義の動作です。誤ってそれを行うのを防ぐためにNULL、 の直後にポインターに割り当てることをお勧めしますdelete。NULL ポインターを逆参照すると、すぐにエラーが発生し、正しい原因が示されます。

于 2012-06-18T19:54:07.847 に答える
0

コードでは、最初に一時ノードを解放することをお勧めします。次に、prev->next を NULL に割り当てます。一時ノードが利用できないことを非常に理解しやすいように、prev->next NULL を作成します。

于 2012-06-24T06:55:20.073 に答える