Rumah >pembangunan bahagian belakang >C++ >Mengapa Memanggil Ahli Bukan Maya Berfungsi pada Penunjuk Null dalam C Kadang-kadang Berfungsi?

Mengapa Memanggil Ahli Bukan Maya Berfungsi pada Penunjuk Null dalam C Kadang-kadang Berfungsi?

DDD
DDDasal
2024-12-13 16:58:10660semak imbas

Why Does Calling a Non-Virtual Member Function on a Null Pointer in C   Sometimes Work?

Gotcha dalam C : Mengakses Ahli Kelas Bukan Maya pada Penunjuk Null

Dalam C , memanggil fungsi ahli bukan maya pada null penunjuk mungkin berfungsi secara tidak dijangka, menimbulkan teka-teki yang ingin tahu. Mari kita mendalami tingkah laku ini melalui coretan kod yang menarik:

class Foo {
public:
    virtual void say_virtual_hi() {
        std::cout << "Virtual Hi";
    }

    void say_hi() {
        std::cout << "Hi";
    }
};

int main() {
    Foo* foo = 0;
    foo->say_hi(); // Works well
    foo->say_virtual_hi(); // Crashes the app
    return 0;
}

Teka-teki Diterangkan

Kekeliruan timbul daripada mekanisme berbeza yang digunakan untuk memanggil kaedah maya dan bukan maya .

  • Kaedah maya: Memerlukan carian vtable untuk menentukan fungsi untuk dipanggil, yang gagal untuk penunjuk nol kerana ia tidak mempunyai objek sah yang dikaitkan dengannya.
  • Kaedah bukan maya: Dihimpun secara langsung sebagai panggilan fungsi dengan penunjuk ini (rujukan objek) diluluskan sebagai parameter tersembunyi.

Dalam kod yang diberikan, kaedah bukan maya say_hi() tidak sekali-kali menafikan penunjuk ini secara eksplisit, memintas ralat penyahrujukan penunjuk nol. Ia pada asasnya adalah setara dengan panggilan fungsi dengan parameter yang diluluskan oleh nilai:

void Foo_say_hi(Foo* this);

Foo_say_hi(foo);

Gelagat Tidak Ditakrifkan

Secara teknikal, memanggil sebarang fungsi (walaupun bukan maya) pada penunjuk nol ialah tingkah laku yang tidak ditentukan dalam C . Walau bagaimanapun, sesetengah pelaksanaan pengkompil mungkin menyediakan gelagat yang jelas untuk senario tertentu, seperti panggilan fungsi bukan maya di atas.

Awas

Walaupun tingkah laku yang tidak dijangka mungkin kelihatan mudah, bergantung padanya adalah berisiko dan bukan amalan terbaik. Sentiasa elakkan mengakses ahli kelas pada penunjuk nol, kerana ia boleh membawa kepada keputusan yang tidak dijangka dan tidak dapat diramalkan.

Atas ialah kandungan terperinci Mengapa Memanggil Ahli Bukan Maya Berfungsi pada Penunjuk Null dalam C Kadang-kadang Berfungsi?. 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