实际上是由于
dr1102的结果被删除的,陈述的推理是放弃零指针并不是不确定的行为。
指示它可能是定义的行为。 ceneral协议认为这是不确定的行为。
error()
if(breakOnError)
{
static volatile int* p = 0;
*p = 0;
}
*
可以在typeid(*p)
上引起违反访问的行为吗?它的IMPLEMENTITATION如下:
*p
或调用此函数意味着,由于行为不确定,现在可以在编译和运行我的程序时发生任何事情?我自己的最佳猜测是,它在技术上是未定义的,但是windows和linux上的正确的东西总是(?)
取消给无效指针值的原因说不是不确定的,是因为他们使用“删除”来表示将操作员应用于指针上,而不是实际上试图访问尖头对象。 dr1102
您链接到与232没有内存保护的系统(一些嵌入式设备),您可以写入地址为零,并且该系统不会(立即)崩溃。
您不能使用标准来对此代码进行推理,只有编译器/OS文档。它似乎在目标操作系统/编译器上正常工作,这就是为什么volatile
被标准指定的全部原因。
如果指针不适合
volatile
,那将是不确定的行为,并且编译器将被允许执行任何操作,包括删除此内存访问或在其之前打破代码。