C++ standard: dereferencing NULL pointer to get a reference? [duplikat]

to pytanie ma już odpowiedzi tutaj : czy możliwe jest odniesienie null? (5 odpowiedzi) Zamknięte 1 rok temu .

Zastanawiam się, co standard C++ mówi o kodzie tak:

int* ptr = NULL;
int& ref = *ptr;
int* ptr2 = &ref;

W praktyce wynik jest taki, że ptr2 jest NULL, ale zastanawiam się, czy to tylko szczegóły implementacji, czy jest to dobrze zdefiniowane w standardzie?
W innych okolicznościach dereferencja wskaźnika NULL powinna spowodować awarię, ale tutaj dereferuję go, aby uzyskać odniesienie, które jest zaimplementowane przez kompilator jako wskaźnik, więc naprawdę nie ma rzeczywistej dereferencja NULL.

Author: shoosh, 2010-04-28

5 answers

Dereferencja wskaźnika NULL jest niezdefiniowanym zachowaniem.

W rzeczywistości norma nazywa tę dokładną sytuację w notatce (8.3.2 / 4 "Referencje"):

Uwaga: w szczególności odniesienie null nie może istnieć w dobrze zdefiniowanym programie, ponieważ jedynym sposobem na stworzenie takiego odniesienia byłoby powiązanie go z "obiektem" uzyskanym przez dereferencję wskaźnika null, co powoduje niezdefiniowane zachowanie.


Na marginesie: jeden raz zdaję sobie sprawę, że wskaźnik NULL może być "dereferenced" w dobrze zdefiniowany sposób jest jak operand do operatora sizeof, ponieważ operand do sizeof nie jest faktycznie oceniany (więc dereferencja nigdy nie występuje).

 48
Author: Michael Burr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-28 08:50:06

Dereferencja wskaźnika NULL jest jawnie niezdefiniowanym zachowaniem w standardzie C++, więc to, co widzisz, jest specyficzne dla implementacji.

Kopiowanie z wersji 1.9.4 w projekcie standardu C++0x (podobne do poprzednich standardów pod tym względem):

Niektóre inne operacje są opisane w tym międzynarodowym standardzie jako undefined (np. efekt dereferowanie wskaźnika null). [Uwaga : ten międzynarodowy Standard nie nakłada żadnych wymagań na zachowanie programów, które zawierają nieokreślone zachowanie. - uwaga końcowa ]

 3
Author: Gorpik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-28 09:55:59

Dereferencja wskaźnika NULL jest niezdefiniowanym zachowaniem. Należy sprawdzić, czy wartość jest NULL przed dereferencing it.

 1
Author: Goz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-28 08:33:17

Dla kompletności, to: http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#232 mówi konkretnie o tym problemie.

 1
Author: shoosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-28 09:03:34
int& ref = *ptr;

Powyższe stwierdzenie nie odwołuje się do niczego. Więc nie ma problemu, dopóki nie użyjesz ref (która jest nieprawidłowa).

 -2
Author: valdo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-28 12:20:27