tl; dr - Potresti espandere i 4 commenti nel primo snippet di codice qui sotto? In particolare, ciò che si intende è derefPuntatore C/C++ Domanda
Sono uno sviluppatore Java da molto tempo che desidera imparare C++. Mi sono imbattuto nello this website per gli sviluppatori nella mia situazione.
int x, *p, *q;
p = new int;
cin >> x;
if (x > 0) q = &x;
*q = 3; // 1. deref of possibly uninitialized ptr q
q = p;
p = new int; // 2. potential storage leak (if x != 0 this
// memory will not be returned to free storage)
*p = 5;
delete q;
*q = 1; // 3. deref of deleted ptr q
q = p;
if (x == 0) delete q;
(*p)++; // 4. deref of possibly dangling ptr p (if x is zero)
Anche se ho pensato ho capito come funzionano i puntatori, sto trovando i commenti difficile da capire.
Il mio take;
- Ci sia assegnando x (& * q ovviamente) per essere 3 o se q! = & x allora q ha un valore come lo è stato inizializzato e abbiamo appena assegnato un pezzo casuale di memoria alla valore 3. Non sono sicuro di come sia possibile annullare la pubblicazione di qualcosa che non è stato inizializzato?
- Questo va bene
- Cosa c'è che non va nel dereferenziamento di un puntatore cancellato? Dopo 'cancellare q' è * q senza significato?
- Cosa c'è di sbagliato con i puntatori penzolanti? La memoria è utilizzabile per la riallocazione ora che l'abbiamo cancellata anche se abbiamo ancora un puntatore?
Penso che il mio equivoco di base riguardi solo la dichiarazione di un puntatore int, anche questo alloca la memoria? È in pila o nel mucchio?
Inoltre dereference significa semplicemente "leggere il valore all'indirizzo dell'indicatore"? Penso che la mia confusione sia che lo interpreto come un riferimento ad alcuni dati come in;
int *x;
x = new int;
*x = 5;
x = new int; // Dereferencing the first bit of memory allocated.
Grazie per la pazienza Mi auguro che questo fa un certo senso come una domanda,
Gav
Buon riepilogo di tutti i problemi che possono verificarsi con un puntatore. –
D'altra parte, i nomi delle variabili rendono impossibile seguire la logica. Il codice reale non è mai lontanamente vicino a questo complicato (o meglio, non dovrebbe essere) –