首先,澄清一下,我不是在谈论取消引用无效指针!
考虑以下两个示例。
示例 1
typedef struct { int *p; } T;
T a = { malloc(sizeof(int) };
free(a.p); // a.p is now indeterminate?
T b = a; // Access through a non-character type?
示例 2
void foo(int *p) {}
int *p = malloc(sizeof(int));
free(p); // p is now indeterminate?
foo(p); // Access through a non-character type?
问题
上述任何一个示例都调用未定义的行为吗?
语境
这个问题是针对这个讨论提出的。建议是,例如,指针参数可以通过 x86 段寄存器传递给函数,这可能会导致硬件异常。
从 C99 标准中,我们学到了以下内容(重点是我的):
[3.17] 不确定值- 未指定的值或陷阱表示
进而:
[6.2.4 p2]当指针指向的对象到达其生命周期的末尾时,指针的值变得不确定。
进而:
[6.2.6.1 p5]某些对象表示不需要表示对象类型的值。如果对象的存储值具有这样的表示形式并且由不具有字符类型的左值表达式读取,则行为是 undefined。如果这种表示是由通过不具有字符类型的左值表达式修改对象的全部或任何部分的副作用产生的,则行为未定义。这种表示称为陷阱表示。
综上所述,我们对访问“死”对象的指针有什么限制?
附录
虽然我在上面引用了 C99 标准,但我很想知道任何 C++ 标准中的行为是否不同。