In un paio di miei vecchi progetti di codice quando non avevo mai sentito puntatori intelligenti, ogni volta che dovevo controllare se il puntatore puntava ancora su un oggetto valido, farei sempre qualcosa di simile ...Nullptr e controlla se un puntatore punta a un oggetto valido
object * meh = new object;
if(meh)
meh->member;
O quando ho avuto bisogno di eliminare l'oggetto in modo sicuro, qualcosa di simile
if(meh)
{
delete meh;
meh = 0;
}
Bene, ora ho imparato a conoscere i problemi che possono derivare da uso di oggetti e puntatori nelle espressioni booleane sia con numeri letterali, nel modo più duro:. E ora ho anche appreso della non così nuova, ma piuttosto interessante funzionalità di C++, la parola chiave nullptr
. Ma ora sono curioso.
ho già attraversato e rivisto la maggior parte del mio codice in modo che, ad esempio, quando si eliminano gli oggetti che vi scrivo
if(meh)
{
delete meh;
meh = nullptr;
}
Ora sto chiedendo circa il booleano. Quando si passa solo dire un int in un'istruzione if come questo,
int meh;
if(meh)
Poi controlla implicitamente per lo zero senza la necessità di scriverlo.
if(meh == 0) // does the exact same check
Ora, il C++ farà lo stesso per i puntatori? Se passi in un char * come questo a un'istruzione if?
char * meh;
if(meh)
Quindi lo comparirà implicitamente con nullptr? A causa di quanto tempo ho scritto questi if in questo modo, è una seconda natura a questo punto verificare se i puntatori sono validi prima di usarli digitando if (oggetto *) e poi chiamando i suoi membri. Se questa non è la funzionalità, perché no? Troppo difficile da attuare? Risolveresti alcuni problemi rimuovendo un altro piccolo modo in cui potresti rovinare il tuo codice.
È ** non ** necessario eseguire il ckeck dei puntatori prima di 'delete'ing. È completamente sicuro eliminare 'a' nullptr'. –
Nel tuo ultimo esempio, intendevi 'char * meh = nullptr; if (meh) '? Il puntatore non è inizializzato. –
Il risultato dell'espressione 'nuova' non sarà mai nullo, al suo posto verranno utilizzate eccezioni. Come detto, l'eliminazione di null va bene, non fa nulla. Inoltre, in genere è meglio non ripristinare il valore di un puntatore su null. L'ultima volta che viene utilizzata dovrebbe essere l'ultima volta che non è nullo, quindi l'accesso a un puntatore eliminato dovrebbe essere considerato un bug; impostandolo su null lo nasconde. – GManNickG