【问题标题】:Why does this code snippet work? How can a nullptr be dereferenced?为什么此代码段有效?如何取消引用 nullptr?
【发布时间】:2020-05-17 11:51:49
【问题描述】:
#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

P.S:这段代码 sn-p 取自 YouTube 上的 Cherno C++ 系列。

【问题讨论】:

  • stackoverflow.com/questions/2533476/…。至于 Youtube 教程,最好还是放弃它,转而看一本好书stackoverflow.com/questions/388242/…
  • “工作”是什么意思?在我的机器上,这段代码崩溃了。
  • 取消引用 nullptr 会导致未定义的行为。 C++ 中“未定义”的含义本质上是“C++ 标准对发生的事情没有任何限制”。实际上,这不需要运行时错误或其他任何东西——它似乎在“工作”的未定义行为的范围内——对于程序员可能对“工作”进行的任何定义。

标签: c++ pointers static static-methods nullptr


【解决方案1】:

正如 StoryTeller 所说,这是未定义的行为。

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

成员函数是采用this 指针的静态函数。在你的成员函数Hello() 中,this 没有被使用,因为你没有访问任何成员变量。所以这个函数实际上是一个void Hello(Singleton* this) {},它传递了一个null,但是没有人使用它,所以没有崩溃。在某些成员函数中使用delete this; 时有一些相似之处;成员被破坏,但不是函数体本身。

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

【讨论】:

    猜你喜欢
    • 2014-02-02
    • 2015-06-06
    • 2013-12-15
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多