读取已释放的指针的值

即使只是读取被释放的指针的值(即不试图取消引用指针),也是未定义的行为(UB),例如

char *p = malloc(5);
free(p);
if (p == NULL) /* NOTE: even without dereferencing, this may have UB */
{

}

引用 ISO / IEC 9899:2011 ,第 6.2.4 节§2:

[…]当指针指向(或刚刚过去)的对象到达其生命周期的末尾时,指针的值变得不确定。

对于任何事物使用不确定的内存,包括明显无害的比较或算术,如果值可以是该类型的陷阱表示,则可能具有未定义的行为。