为什么此代码段有效?如何取消引用nullptr?

#include <iostream>

class Singleton {
private:
    static Singleton* s_instance;

public:
    static Singleton& Get() {
        return *s_instance;
    }

    void Hello() {
        std::cout << "Hey Bro" << std::endl;
    }
};

Singleton* Singleton::s_instance = nullptr;

int main() {
    Singleton::Get().Hello();
    return 0;
}

并打印成员函数Hello()的输出。如何在静态成员函数Get()中取消引用nullptr

附注:此代码段摘自YouTube上的Cherno C ++系列。

评论
  • 给不了告白
    给不了告白 回复

    正如StoryTeller所说,这是不确定的行为。

    很有可能它是“有效的”,因为您实际上没有在程序集级别使用指针。

    Member functiors are static functions which take the this pointer. In your member function Hello(), this is not used because you are not accessing any member variables. So the function is actually a void Hello(Singleton* this) {} which is passed a null, but noone uses it, so no crash.

    但是正如所说的,它是UD,任何事情都可能发生。永远不要依赖这种行为。