我正在尝试运行以下程序:
#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时,两个调用都不应该失败吗?
答案 0 :(得分:3)
在想知道未定义行为如何以及何时起作用时没有用处。从技术上讲,在第二种情况下,您访问对象的成员变量(为NULL),并且您在第一次调用时不会访问该变量,因此这可能是崩溃的原因。
答案 1 :(得分:2)
您的代码的行为是 undefined ,您无法取消引用设置为NULL
的指针。如果您想知道编译器对代码执行了什么操作,请检查生成的程序集。
有趣的是,许多编译器将允许您以这种方式获得static
成员函数(并将在其文档中说明);因为这是在C ++ 89中正式引入static
成员函数之前,程序员在CFront(C ++的前身)中使用的解决方法。请注意,bar
本质上是一个static
函数,因为它不访问任何类成员数据或调用任何类成员函数。
答案 2 :(得分:0)
如上所述,这段代码是未定义的行为,这意味着它不可预测,不应该依赖
在这个spécifique案例中,你的一个fonction访问一个数据membre意味着这个(女巫是NULL)指针需要被解引用,而在另一种情况下,这个指针不需要取消引用,因为没有从类访问< / p>