Rumah >pembangunan bahagian belakang >C++ >Mengapa Kaedah Bukan Maya Memanggil pada Penunjuk Null Kadangkala Mengelakkan Ranap dalam C ?

Mengapa Kaedah Bukan Maya Memanggil pada Penunjuk Null Kadangkala Mengelakkan Ranap dalam C ?

DDD
DDDasal
2024-12-14 09:29:12843semak imbas

Why Do Non-Virtual Method Calls on Null Pointers Sometimes Avoid Crashes in C  ?

Panggilan Kaedah Bukan Maya dan Penunjuk Null: Paradoks

Mengakses ahli kelas melalui penuding nol biasanya mengakibatkan ranap sistem. Walau bagaimanapun, dalam C , kaedah bukan maya tertentu nampaknya berfungsi walaupun dengan penunjuk nol. Tingkah laku ini menimbulkan beberapa persoalan: bagaimana ini berlaku, dan di manakah objek diperuntukkan?

Memahami Panggilan Kaedah Bukan Maya

Dalam C , apabila kaedah bukan maya dipanggil pada null penunjuk, pengkompil menjana panggilan terus ke fungsi yang dikaitkan dengan kaedah itu. Ia melakukan ini dengan menghantar parameter tersembunyi (penunjuk ke objek) kepada fungsi.

Dalam contoh yang disediakan:

class Foo {
  void say_hi();
};

Foo* foo = nullptr;
foo->say_hi();

Pengkompil mengubahnya menjadi:

void Foo_say_hi(Foo* this);

Foo_say_hi(foo);

Memandangkan kaedah say_hi tidak pernah merujuk kepada ahli objek, ia tidak mengabaikan penunjuk nol dan dengan itu mengelakkan ralat.

Kelakuan Tidak Ditakrifkan dan Pengoptimuman Pengkompil

Secara formal, memanggil sebarang kaedah pada penuding nol ialah tingkah laku yang tidak ditentukan. Walau bagaimanapun, penyusun boleh mengoptimumkan kod dengan mengandaikan bahawa objek itu tidak batal. Ini berisiko kerana ia boleh membawa kepada tingkah laku yang tidak dijangka.

Dalam kes contoh, pengkompil mengoptimumkan panggilan kaedah bukan maya untuk mengelakkan ranap sistem. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa tingkah laku ini tidak dijamin. Memanggil kaedah bukan maya pada penuding nol masih harus dielakkan kerana ia boleh membawa kepada hasil yang tidak ditentukan.

Peruntukan Objek

Objek yang dirujuk oleh penuding foo dalam contoh tidak diperuntukkan dalam fungsi utama. Pembolehubah tempatan dengan jenis Foo* dicipta pada tindanan, dan nilai yang diberikan kepadanya ialah penunjuk nol. Ini bermakna objek itu sendiri tidak wujud di mana-mana dalam ingatan.

Atas ialah kandungan terperinci Mengapa Kaedah Bukan Maya Memanggil pada Penunjuk Null Kadangkala Mengelakkan Ranap dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn