tem*_*def 2 c++ pointers language-lawyer
考虑以下C++代码:
int main() {
int* ptr; // Deliberately uninitialized
(void) *ptr; // Dereference, do not use result
}
Run Code Online (Sandbox Code Playgroud)
此代码是否会导致未定义的行为?我假设答案是肯定的,即使*ptr实际上并没有在任何地方使用它.是否有规范的特定部分可以保证这一点?
(如果这是重复的话我很抱歉,但我似乎无法在网站上找到任何其他具体提出此问题的内容.)
简单地解除引用尚未分配或标记为只读的指针可能会导致CPUs内存管理单元中出现硬件异常.因此,即使您不使用通过取消引用包含随机值的指针返回的任何垃圾值,也无法保证CPU将从此类事件返回.
但是,根据ISO C++11 Standard声明未初始化的指针必须具有奇异值.所以未初始化指针的值不是未定义的,因为它不是垃圾.
然而,标准指出,在这样一个大多数操作奇异值指针与覆盖之外不确定奇异值与非奇异值:
24.2.1一般[ iterator.requirements.general ]
5 [示例:在声明未初始化的指针x(与int*x;一样)之后,必须始终假定x具有指针的奇异值.- 结束示例]对于奇异值,大多数表达式的结果未定义; 唯一的例外是破坏一个包含奇异值的迭代器,一个非奇异值赋值给一个包含奇异值的迭代器,对于满足DefaultConstructible要求的迭代器,使用一个值初始化的迭代器作为源复制或移动操作.[注意:默认初始化不提供此保证,但区别仅适用于具有普通默认构造函数的类型,例如指针或包含指针的聚合. - 结束说明]在这些情况下,奇异值将以与任何其他值相同的方式被覆盖.可解除引用的值总是非单数的.