Compilerà sempre senza errori.
Se è una buona cosa passare un puntatore in una funzione ed eliminarlo in quella funzione è potenzialmente un'altra storia, a seconda delle specifiche del programma.
L'idea principale che è necessario considerare è quella di "proprietà" dei dati puntati. Quando si passa quel puntatore, la funzione chiamante ha la proprietà dei dati che vengono passati? cioè è nell'unico luogo dal quale si può fare riferimento a questi dati? Stai rinunciando alla proprietà dei dati puntati, senza alcuna possibilità che la funzione chiamante possa mai fare nuovamente riferimento ai dati? Se è così, allora devi cancellarlo.
Se la funzione di chiamata può fare nuovamente riferimento ai dati, non è necessario eliminarli.
Se ci sono altri riferimenti ai dati attraverso varie strutture di dati, non è sicuro cancellare questi dati se non si dispone di una disciplina in vigore nel codice per garantire che non si farà mai più riferimento ai dati da tali luoghi. Questo è difficile da fare ed è la fonte di molti bug di programmazione.
C++ tr1's shared_ptr < > è un puntatore intelligente che aiuta in questo tipo di situazioni: gestisce questo concetto di proprietà mantenendo un conteggio dei riferimenti che tiene traccia del numero di riferimenti ai dati. Se il conteggio dei riferimenti è 1, allora c'è 1 chiaro proprietario. Se il numero di riferimenti è maggiore di 1, la proprietà viene condivisa. Se il conteggio dei riferimenti è 0, non ci sono più riferimenti ai dati e shared_ptr < > lo eliminerà quando viene chiamato il distruttore < > shared_ptr.
fonte
2009-12-10 15:33:06
Quello che ho sempre trovato sorprendente è che l'eliminazione del puntatore è legale anche se è 'const'. –