请考虑以下代码:
#include <iostream>
struct foo
{
// (a):
void bar() { std::cout << "gman was here" << std::endl; }
// (b):
void baz() { x = 5; }
int x;
};
int main()
{
foo* f = 0;
f->bar(); // (a)
f->baz(); // (b)
}
Run Code Online (Sandbox Code Playgroud)
我们期望(b)崩溃,因为x空指针没有相应的成员.在实践中,(a)不会崩溃,因为this从不使用指针.
因为(b)取消引用this指针((*this).x = 5;),并且this为null,程序进入未定义的行为,因为取消引用null总是被称为未定义的行为.
会(a)导致未定义的行为吗?如果两个函数(和x)都是静态的呢?
c++ standards-compliance null-pointer undefined-behavior language-lawyer
我接受了以下面试问题:
class A
{
public:
void fun()
{
std::cout << "fun" << std::endl;
}
};
A* a = NULL;
a->fun();
Run Code Online (Sandbox Code Playgroud)
执行此代码时会发生什么,为什么?
我最近遇到了以下代码:
class Foo
{
public:
void bar();
// .. other stuff
};
void Foo::bar()
{
if(!this) {
// .. do some stuff without accessing any data members
return;
}
// .. do normal actions using data members
}
Run Code Online (Sandbox Code Playgroud)
代码编译是因为在C++方法中只是隐式传递'this'指针的函数,'this'可以像任何其他指针一样被检查为NULL.显然,即使它没有崩溃,这段代码也会让人感到困惑和不好.在调试器中单步调试代码会非常混乱,看到一个NULL指针即将有一个调用它的方法,然后看不到预期的崩溃.我的问题是:它是否违反了C++标准来调用SomeFooPtr->bar()哪里SomeFooPtr == NULL?
我发现它可能不是因为用户定义的operator->返回一个指针,这意味着即使该指针为NULL,它肯定没有被解除引用(取消引用一个NULL指针我敢肯定被标准视为非法或未定义).另一方面,原始指针的语义不一定必须与用户定义的指针的语义匹配 - 也许操作符 - 对它们来说被认为是解除引用,即使编译器不会生成一个.