tl; dr - Czy możesz rozwinąć 4 komentarze w pierwszym fragmencie kodu poniżej? W szczególności chodzi o derefPytanie C/C++ Pytanie
Jestem długoletnim programistą Java, który chce się uczyć języka C++. Natknąłem się na this website skierowaną do programistów w mojej sytuacji.
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)
Chociaż wydawało mi się, że rozumiem, jak działają wskaźniki, znajduję komentarze trudne do zrozumienia.
My take;
- Jesteśmy albo przypisanie x (& * q oczywiście) być 3 lub jeżeli q! = & x wtedy q ma tylko wartość, jak to było niezainicjowany i właśnie przypisany losowy kawałek pamięci na wartość 3. Nie wiem, w jaki sposób można usunąć coś, co nie zostało zainicjowane?
- To jest w porządku
- Co jest nie tak z usuwaniem usuniętego wskaźnika? Po "usuń q" jest * q bez znaczenia?
- Co jest nie tak z wiszącymi wskaźnikami? Czy pamięć jest realistyczna do ponownego przydzielenia, skoro ją usunęliśmy, mimo że wciąż mamy do niej wskaźnik?
Myślę, że moje podstawowe nieporozumienie dotyczy tylko deklarowania wskaźnika int, czy to również przydziela pamięć? Czy jest na stosie lub sterty?
Czy dereferencja oznacza także "odczytanie wartości pod adresem wskaźnika"? Myślę, że moje zamieszanie polega na tym, że interpretuję to jako utratę odniesienia do niektórych danych w;
int *x;
x = new int;
*x = 5;
x = new int; // Dereferencing the first bit of memory allocated.
Dzięki za ciebie cierpliwość mam nadzieję, że to sprawia, że jakiś sens jako pytanie,
GAV
Dobre podsumowanie wszystkich problemów, które mogą wystąpić w przypadku wskaźnika. –
Z drugiej strony nazwy zmiennych uniemożliwiają przestrzeganie logiki. Prawdziwy kod nigdy nie jest zdalnie zbliżony do tego skomplikowanego (a raczej nie powinno być) –