将程序:
#include <stdio.h>
struct foo
{
void blah() {printf("blah\n");}
int i;
};
void main(int, char**)
{
((foo*)NULL)->blah();
}
blah
曾经在您知道的任何编译器上崩溃或执行除输出之外的任何操作吗?如果任何函数不访问任何成员(包括 vtable),当通过 NULL 指针调用时,它会崩溃吗?
关于这个主题还有其他问题,例如访问空指针上的类成员以及调用不通过空指针访问成员的非静态方法是否合法/定义明确的 C++?,并且总是指出这会导致未定义的行为。但这是在现实世界中未定义,还是仅在标准世界中?任何现存的编译器都没有按预期运行吗?你能想出任何合理的理由说明为什么未来的编译器不会按预期运行吗?
如果函数确实修改了成员,但 NULL ptr 被防范了怎么办。例如,
void foo::blah()
{
foo* pThis = this ? this : new foo();
pThis->i++;
}
编辑:为了记录,我想要这样做的原因是使我的链表类的接口尽可能简单和简洁。我想将列表初始化为 NULL 具有惯用的用法如下所示:
pList = pList->Insert(elt);
pList = pList->Remove(elt);
...
所有运算符都返回新的 head 元素。不知何故,我没有意识到使用容器类会使事情变得更容易,而且没有任何缺点。