【发布时间】:2011-01-29 06:18:20
【问题描述】:
考虑以下代码:
#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)
}
我们预计(b) 会崩溃,因为空指针没有对应的成员x。实际上,(a) 不会崩溃,因为从未使用过 this 指针。
因为(b) 取消引用this 指针((*this).x = 5;),并且this 为空,所以程序进入未定义行为,因为取消引用空总是被称为未定义行为。
(a) 会导致未定义的行为吗?如果两个函数(和x)都是静态的呢?
【问题讨论】:
-
如果两个函数都是static,那么如何在baz中引用x呢? (x 是一个非静态成员变量)
-
@legends2k:假装
x也被设为静态。 :) -
当然可以,但是对于情况 (a),它在所有情况下都一样,即调用函数。但是,将指针的值从 0 替换为 1(例如,通过 reinterpret_cast),它几乎总是会崩溃。 0 和 NULL 的值分配,如案例 a,是否代表了编译器的特殊之处?为什么它总是在分配给它的任何其他值时崩溃?
-
有趣:C++ 的下一个版本,将不再有指针的解引用。我们现在将通过指针执行间接。要了解更多信息,请通过此链接执行间接:N3362
-
在空指针上调用成员函数是总是未定义的行为。只看你的代码,我已经能感觉到未定义的行为慢慢爬上了我的脖子!
标签: c++ undefined-behavior language-lawyer standards-compliance null-pointer