C ++标准究竟在哪里说取消引用未初始化的指针是未定义的行为?

C ++标准究竟在哪里说取消引用未初始化的指针是未定义的行为?

到目前为止,我无法找到如何推断以下内容:

int* ptr;*ptr = 0;

是未定义的行为。

首先,有5.3.1 / 1表示这*意味着转换T*为的间接T。但这对UB没有任何说明。

然后经常引用3.7.3.2/4说在非空指针上使用解除分配函数会使指针无效,之后无效指针的使用是UB。但是在上面的代码中没有关于释放的内容。

如何在上面的代码中推导出UB?


慕容708150
浏览 587回答 3
3回答

慕工程0101907

第4.1节看起来像一个候选人(强调我的):可以将非函数非数组类型T的左值(3.10)转换为右值。如果T是不完整类型,则需要进行此转换的程序格式不正确。如果左值引用的对象不是类型T的对象,并且不是从T派生的类型的对象,或者如果对象未初始化,则需要此转换的程序具有未定义的行为。如果T是非类型,则rvalue的类型是T的非限定版本。否则,rvalue的类型是T.我敢肯定只是在规范中搜索“uninitial”可以找到更多的候选人。

撒科打诨

OP的问题是无稽之谈。没有要求标准说某些行为是不确定的,事实上,我认为所有这些措辞都应从标准中删除,因为它会使人感到困惑并使标准更加冗长而不必要。标准定义了某些行为。问题是,它是否指定了这种情况下的任何行为?如果没有,则无论是否明确说明,行为都是不确定的。实际上,有些事情未定义的规范在标准中主要作为标准编写者的调试辅助,如果在一个地方存在与另一个地方的未定义行为的明确陈述冲突的想法,则产生矛盾的想法:这是证明标准缺陷的一种方法。如果没有未定义行为的明确陈述,则规定行为的其他条款将是规范性的且不受质疑。
打开App,查看更多内容
随时随地看视频慕课网APP