答案 0 :(得分:6)
您编写的代码将编译,因为编译器在编译时不检查指针的值。但是,取消引用NULL指针是未定义的行为。
这是我过去遇到的一个问题,并被烧进了我的记忆中。我的进一步想法可以在这里找到:https://stackoverflow.com/a/57656/5987
答案 1 :(得分:4)
取自the C++ FAQ:
C ++标准定义的C ++语言表示它是非法的;这使它成为非法的。 C ++标准不需要对此特定错误进行诊断,这意味着您的特定编译器没有义务注意到p为NULL或提供错误消息,但它仍然是非法的。 C ++语言也不需要编译器生成在运行时会爆炸的代码。
答案 2 :(得分:1)
您取消引用空指针。你的编译器没有被要求抱怨这样的不良程序。然而,这并不意味着在运行此事时你不会发生任何不好的事情。
来自C ++ 03 8.3.2 / 4:
注意:特别是,在明确定义的程序中不能存在空引用,因为唯一 创建这样一个引用的方法是将它绑定到通过解除引用空指针获得的“对象”, 这会导致未定义的行为。
答案 3 :(得分:-3)
没有。 ptr是一个具有地址的指针。您将该指针设置为null。所以该指针的值为null。但指针本身有一个地址。引用被设置为指针的地址 - 而不是其值。
现在引用NULL本身 - 这会失败。 e.g:
int &ref = &NULL; // fail