如果變量temp
可能被再次在代碼中使用以後,那麼它是很好的做法,將其設置爲NULL。
有兩個原因,通常在釋放指針後將其設置爲NULL。
1.)一旦你釋放一個指針,指向的地址的內存不再可用於你的程序。從理論上講,該內存現在可以被任何其他程序使用,包括操作系統本身!試圖釋放已經發布的指針,並指出誰知道可能導致嚴重問題的指針。幸運的是,現代操作系統可以防止這種情況發生,但程序仍然會因非法訪問錯誤而崩潰。釋放一個空指針OTOH將完全不做任何事情。
2.)在使用*
運算符取消引用它之前,您應該始終檢查指針是否爲NULL。取消引用NULL指針將導致運行時錯誤。取消引用指向某些任意內存的已釋放指針甚至更糟糕。釋放的指針應始終設置爲NULL
,以便後面的代碼可以假定非空指針指向有效數據。否則,無法知道指針是否仍然有效。
至於原來的問題,指針變量temp
被聲明爲一個短函數中的局部變量,它不再被使用。在這種情況下,只要函數返回,就不需要將其設置爲NULL。
然而,行...
(*head)->next = (*head)->next->next;
未能確保(*head)->next
不爲空試圖取消引用之前,一個沒有沒有。
一個更好的版本是...
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;
}
現在使用功能可以檢查節點的缺失是否是返回值成功並沒有試圖刪除一個不存在風險的人節點。
不要。只需使用智能指針。 – chris
這裏是否將它設置爲NULL是絕對不相關的。 'temp'是一個具有自動存儲的變量,意味着退出'else'模塊後它將超出範圍。但正如@chris所說,只是使用智能指針 –
,'* head'不是'NULL'的事實並不意味着'(* head) - > next'不是'NULL',並且您試圖解引用那個指針('(* head) - > next - > ...') –