変数temp
がコードの後半で再び使用される可能性がある場合は、変数をNULLに設定することをお勧めします。
通常、ポインタを解放した後にNULLに設定する理由は2つあります。
1.)ポインタを離すと、ポイントされたアドレスのメモリがプログラムで使用できなくなります。理論的には、そのメモリは、オペレーティングシステム自体を含む他のプログラムで使用できるようになりました。すでにリリースされているポインタをリリースしようとしているため、大きな問題を引き起こす可能性のあるものを誰が知っているかを示します。幸いなことに、最新のオペレーティングシステムはこれを防ぎますが、プログラムは不正なアクセスエラーでクラッシュします。ヌルポインタOTOHを解放しても、まったく何も起こりません。
2.)演算子で参照を解除する前に、ポインタがNULLでないことを常に確認する必要があります*
。NULLポインターを逆参照すると、実行時エラーが発生します。任意のメモリを指す解放されたポインタの参照を解除すると、さらに悪化します。解放されたポインタは常にに設定する必要がありますNULL
。これにより、後のコードでnull以外のポインタが有効なデータを指していると見なすことができます。そうしないと、ポインタがまだ有効かどうかを知る方法がありません。
元の質問に関しては、ポインター変数temp
は、二度と使用されない短い関数でローカル変数として宣言されています。この場合、関数が戻るとすぐにスコープから外れるため、NULLに設定する必要はありません。
しかし、ライン...
(*head)->next = (*head)->next->next;
(*head)->next
参照解除を試みる前に、nullでないことを確認できません。
より良いバージョンは...
int DeleteAfter(Node **head){
Node *node_after = NULL;
if(*head==NULL)
return -1;
node_after = (*head)->next;
if(node_after == NULL)
return -1;
(*head)->next = node_after->next;
delete node_after;
return 0;
}
これで、関数を使用する人は、戻り値によってノードの削除が成功したかどうかを確認でき、存在しないノードを削除しようとするリスクはありません。