Se la variabile temp
potrebbe essere riutilizzati in seguito nel codice, allora è buona norma impostare a NULL.
Ci sono due motivi per cui normalmente si imposta un puntatore su NULL dopo averlo rilasciato.
1.) Una volta rilasciato un puntatore, la memoria all'indirizzo indicato non è più disponibile per il programma. In teoria, quella memoria potrebbe ora essere utilizzata da qualsiasi altro programma, incluso il sistema operativo stesso! Tentativo di rilasciare un puntatore che è già stato rilasciato e quindi punta a chissà cosa potrebbe causare un grosso problema. Fortunatamente i sistemi operativi moderni proteggono da questo, ma il programma si bloccherà ancora con un errore di accesso illegale. Rilasciando un puntatore nullo OTOH non farà assolutamente nulla.
2.) Si deve sempre controllare che un puntatore non sia NULL prima di de-referenziarlo con l'operatore *
. La de-referenziazione di un puntatore NULL causerà un errore in fase di esecuzione. De-referenziare un puntatore rilasciato che punta a una memoria arbitraria è anche peggio. Un puntatore rilasciato deve sempre essere impostato su NULL
in modo che il codice successivo possa assumere un puntatore non nullo per i dati validi. Altrimenti non c'è modo di sapere se il puntatore è ancora valido.
Come per la domanda originale, la variabile di puntatore temp
viene dichiarata come variabile locale in una funzione breve in cui non viene mai più utilizzata. In questo caso non è necessario impostarlo su NULL poiché non è più disponibile dopo il ritorno della funzione.
Tuttavia, la linea ...
(*head)->next = (*head)->next->next;
non riesce a fa in modo (*head)->next
non è nullo prima di tentare di de-riferimento, un no-no.
Una versione migliore sarebbe ...
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;
}
Ora la persona che utilizza la funzione può verificare se l'eliminazione del nodo ha avuto successo per il valore di ritorno e non v'è alcun rischio di cercare di eliminare un inesistente nodo.
No. Basta usare un puntatore intelligente. – chris
qui è assolutamente irrilevante se lo si imposta su NULL o no. 'temp' è una variabile con memorizzazione automatica, il che significa che uscirà dall'ambito dopo l'uscita dal blocco' else'. ma come dice @chris, basta usare i puntatori intelligenti –
anche, il fatto che '* head' non sia' NULL' non significa che '(* head) -> next' non sia' NULL', e tu stia cercando di dereferenziare quel puntatore ('(* head) -> next -> ...') –