C99中执行free后对原指针做等值比较是否属于不安全操作?
你贴出的代码如下:
void *p1=malloc(1024); free(p1); void *p2=malloc(1024); if (p1==p2) { printf("Now What?") }
结论:你的认知不正确,这段代码属于未定义行为,确实存在安全风险。
- C语言标准明确规定:当指针指向的内存块被
free释放后,该指针就成为无效指针,任何对无效指针的使用(哪怕只是读取它的值做比较,没有进行解引用访问内存)都属于未定义行为,没有任何可预期的运行结果。 - 很多开发者会误以为指针只是存储内存地址的普通整型变量,只读它的值不会产生问题,但这个认知不符合C语言的抽象模型约定:指针的有效性和它指向的内存的生命周期强绑定,内存释放后指针的值本身就变为不确定状态,读取不确定值的行为天然就是未定义的。
- 实际运行层面也存在可复现的风险:
- 部分特殊硬件架构的指针并非普通整数,会携带权限、段标记等额外信息,内存释放后读取该指针的值可能直接触发硬件异常。
- 现代编译器的优化逻辑会默认开发者不会执行未定义行为,完全可能直接将
if (p1==p2)这个分支整体优化删除,或者返回完全不符合预期的比较结果——哪怕内存分配器确实把同一块地址重新分配给了p2,这段判断的结果也没有任何可靠性。
- 最佳实践建议:指针
free之后要么立即赋值为NULL,要么保证后续不会以任何形式使用这个指针。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

