Ci sono alcuni casi molto rari in cui potresti non essere in grado di utilizzare un puntatore intelligente (probabilmente si tratta di codice vecchio), ma non puoi nemmeno utilizzare un semplice schema di "proprietà".
Immagina di avere uno std::vector<whatever*>
e alcuni dei puntatori whatever*
puntano allo stesso oggetto. Una pulizia sicura implica che non si cancelli due volte lo stesso, quindi crea un oggetto std::set<whatever*>
e elimina solo i puntatori che non sono già presenti nel set. Una volta eliminati tutti gli oggetti appuntiti, entrambi i contenitori possono essere cancellati in modo sicuro.
Il valore di ritorno da insert
può essere utilizzato per determinare se l'elemento inserito era nuovo o meno. Non ho ancora testato i seguenti (o utilizzato std :: set per un po '), ma penso che la segue è giusto ...
if (myset.insert (pointervalue).second)
{
// Value was successfully inserted as a new item
delete pointervalue;
}
Non si dovrebbe progettare progetti in modo che ciò è necessario, naturalmente, ma non è troppo difficile affrontare la situazione se non puoi evitarlo.
Non dovrebbe funzionare? delete null è specificato nello standard, quindi ha permesso e dovrebbe funzionare. OK, non è il miglior stile di codifica ... –
@ Mario: L'eliminazione di NULL è specificata come NO-OP ma il suo richiamo comporta un sovraccarico. –
Il problema q e p non saranno NULL, quindi ci saranno doppie eliminazioni. –