我已经看到,在 C 或 C++ 抽象机中,仅在内存中形成指向无效点的点的行为就是未定义的行为。
例如
int* arr = new int[10];
int* last = arr + 9; // last element
int* end = arr + 10; // past last element, still ok according to the rules
int* another = arr + 11; // invalid, UB, supposedly, the rest of the program can be invalid
现在假设,这个其他代码
int* arr; // arr can be invalid already here, UB?
int* another = arr; // forming a pointer to possibly invalid memory, UB?
分配未初始化的指针与通过操作形成无效指针有何不同?有那么糟糕吗?
int* arr; // arr can be invalid already here, UB?`
不是 UB,因为在这里您没有使用/访问
arr
的值。
int* another = arr; // forming a pointer to possibly invalid memory, UB?
UB,因为您正在访问一个不确定的值来分配/初始化给另一个值。
分配未初始化的指针与通过操作形成无效指针有何不同?有那么糟糕吗?
它们在技术上都是未定义的行为,因此从语言律师的角度来看,它们同样糟糕,因为它们允许代表实现的任意行为。
未定义的行为没有“层级”。