C++ standard: dereferencing NULL pointer to get a reference? [duplikat]
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.
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).
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 ]
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.
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.
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).
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