为什么一次调用null成功而另一次失败?

时间:2018-06-07 07:13:09

标签: c++ null

我正在尝试运行以下程序:

#include <iostream>
struct Foo {
    int x;
    void bar() {
        std::cout << "La la la" << std::endl;
    }
    void baz() {
        std::cout << x << std::endl;
    }
};
int main() {
    Foo *foo = NULL;
    foo->bar();
    foo->baz();
}

Output

./a.out 
La la la
Segmentation fault (core dumped)

我在ubuntu 18.04上使用g ++版本7.3.0。当对象设置为null时,两个调用都不应该失败吗?

3 个答案:

答案 0 :(得分:3)

在想知道未定义行为如何以及何时起作用时没有用处。从技术上讲,在第二种情况下,您访问对象的成员变量(为NULL),并且您在第一次调用时不会访问该变量,因此这可能是崩溃的原因。

答案 1 :(得分:2)

您的代码的行为是 undefined ,您无法取消引用设置为NULL的指针。如果您想知道编译器对代码执行了什么操作,请检查生成的程序集。

有趣的是,许多编译器将允许您以这种方式获得static成员函数(并将在其文档中说明);因为这是在C ++ 89中正式引入static成员函数之前,程序员在CFront(C ++的前身)中使用的解决方法。请注意,bar 本质上是一个static函数,因为它不访问任何类成员数据或调用任何类成员函数。

答案 2 :(得分:0)

如上所述,这段代码是未定义的行为,这意味着它不可预测,不应该依赖

在这个spécifique案例中,你的一个fonction访问一个数据membre意味着这个(女巫是NULL)指针需要被解引用,而在另一种情况下,这个指针不需要取消引用,因为没有从类访问< / p>