Pertanyaan C ++ standard: dereferencing NULL pointer untuk mendapatkan referensi?


Saya bertanya-tanya tentang apa yang dikatakan C ++ tentang kode seperti ini:

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

Dalam prakteknya hasilnya adalah itu ptr2 NULL tapi saya bertanya-tanya, apakah ini hanya merupakan detail implementasi atau apakah ini didefinisikan dengan baik dalam standar?
Dalam keadaan yang berbeda, sebuah dereferencing penunjuk NULL akan menghasilkan crash tetapi di sini saya dereferencing untuk mendapatkan referensi yang diimplementasikan oleh kompiler sebagai penunjuk sehingga benar-benar tidak ada dereferencing NULL yang sebenarnya.


32
2018-04-28 08:28


asal


Jawaban:


Dereferencing pointer NULL adalah perilaku tidak terdefinisi.

Sebenarnya standar menyebut situasi yang tepat ini dalam sebuah catatan (8.3.2 / 4 "Referensi"):

Catatan: khususnya, referensi null tidak bisa ada dalam program yang terdefinisi dengan baik, karena satu-satunya   cara untuk membuat referensi semacam itu adalah dengan mengikatnya ke "objek" yang diperoleh dengan melakukan dereferensi pointer null, yang menyebabkan perilaku tidak terdefinisi.


Sebagai samping: Satu kali saya menyadari bahwa pointer NULL dapat "dereferenced" dalam cara yang terdefinisi dengan baik adalah sebagai operan ke sizeof operator, karena operan ke sizeof sebenarnya tidak dievaluasi (jadi dereference tidak pernah benar-benar terjadi).


44
2018-04-28 08:34



Dereferencing pointer NULL adalah perilaku eksplisit tidak terdefinisi dalam standar C ++, jadi apa yang Anda lihat adalah implementasi spesifik.

Menyalin dari 1.9.4 dalam standar draf C ++ 0x (serupa dengan standar sebelumnya dalam hal ini):

Operasi tertentu lainnya dijelaskan   dalam Standar Internasional ini sebagai   tidak terdefinisi (misalnya, efek dari   dereferencing penunjuk null).   [Catatan: Standar Internasional ini   tidak memberlakukan persyaratan pada   perilaku program yang mengandung   perilaku tidak terdefinisi. - catatan akhir]


2
2018-04-28 08:35



Dereferencing pointer NULL adalah perilaku tidak terdefinisi. Anda harus memeriksa apakah suatu nilai NULL sebelum dereferencing itu.


1
2018-04-28 08:33



Untuk kelengkapan, ini: http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#232 berbicara secara khusus tentang masalah ini.


1
2018-04-28 09:03



int& ref = *ptr;

Pernyataan di atas tidak benar-benar menentukan apa-apa. Jadi tidak ada masalah sampai Anda menggunakan ref (yang tidak valid).


-2
2018-04-28 12:20