请考虑以下代码:
#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
这段代码是否有效(和定义的行为)?
int &nullReference = *(int*)0;
Run Code Online (Sandbox Code Playgroud)
这两个g ++以及铛++编译它没有任何警告,即使使用-Wall,-Wextra,-std=c++98,-pedantic,-Weffc++...
当然,引用实际上不是null,因为它无法访问(这意味着取消引用空指针),但我们可以通过检查其地址来检查它是否为null:
if( & nullReference == 0 ) // null reference
Run Code Online (Sandbox Code Playgroud) 根据ISO C++,取消引用空指针是未定义的行为.我的好奇心是,为什么?为什么标准决定声明它未定义的行为?这个决定背后的理由是什么?编译器依赖?似乎没有,因为根据C99标准,据我所知,它是明确定义的.机器依赖?有任何想法吗?
是否可以在c ++中将引用成员初始化为NULL?
我正在尝试这样的事情:
class BigClass
{
private:
Object m_inner;
public:
const Object& ReadOnly;
BigClass() : ReadOnly(NULL)
{
Do stuff.
}
};
Run Code Online (Sandbox Code Playgroud)
我知道我能做到这一点,如果我初始化"只读"到对象的实际的参考,但是当我想摆在那里"NULL",我得到的错误:
"无法从'int'转换为'const Object&'
我怎么解决这个问题?
C++标准的哪个版本(如果有的话)是以下定义明确的?
void foo(void) {
char *nullPtr = NULL;
&*nullPtr;
}
Run Code Online (Sandbox Code Playgroud)
请注意,我在&*nullPtr这里特别询问.我知道这只是*nullPtr未定义的 - 但这是一个单独的问题,因此当前链接的"重复"不是重复的.
请注意,我没有将结果分配给任何东西 - 第二行是一个简单的语句.
这应该是一个有明显答案的问题,但是(就像在这些问题上看似经常发生的那样)我听到的同样有很多人说答案"明显未定义"为"明确定义".
在一个相当相关的说明,以下是什么?应该foo产生一个c?
extern volatile char c;
void bar(void) {
volatile char *nonnullptr = &c;
&*nonnullptr;
}
Run Code Online (Sandbox Code Playgroud)
(相同问题的C版本:C中的&*NULL定义良好吗?)
空指针取消引用通常会导致运行时错误,程序立即崩溃.为什么不使这些情况特殊,抛出异常并允许程序员处理它运行时并保持程序运行?