【问题标题】:Using pointer after free() in C99?在 C99 中的 free() 之后使用指针?
【发布时间】:2021-11-27 20:10:29
【问题描述】:

我的教授显示了以下代码:

void *p1=malloc(1024);
free(p1);
void *p2=malloc(1024);
if (p1==p2)
{
    printf("Now What?")
}

他说不安全,但为什么呢?

我知道我们不应该尝试访问已释放的内存。但是,知道指针指向的位置是可以的,因为它只是一个普通的指针,只要我们不尝试从它指向的位置读取。

【问题讨论】:

  • 在任何一种情况下都不应尝试从指针位置读取,因为在上述代码中内存内容是不确定的。但如果p1p2 具有相同的值,则使用哪一个都没有关系。
  • 这段代码 sn-p 不包含任何未定义的行为,因为它不访问存储在p1 中的地址处的内存。如果p2p1 具有相同的值,您甚至可以访问内存。 malloc 是否会返回之前 freed 之前的内存地址,这取决于实现。
  • Per port70.net/~nsz/c/c11/n1570.html#6.2.4p2 - “当指针指向(或刚刚过去)的对象到达其生命周期的终点时,指针的值变得不确定。” 所以使用程序流控制的不确定值是未定义的行为
  • @Bodo 您的评论,但很多赞成是不正确的。请参阅发布的答案。

标签: c pointers malloc free


【解决方案1】:

这实际上是不安全的,因为指向已释放内存的指针是不确定的。

C standard 的附件 J.2 提供了 undefined behavior 的示例,包括以下内容:

  • 使用指向生命周期已结束的对象的指针的值 (6.2.4)。

...

  • 指向通过调用free 或 使用了realloc 函数(7.22.3)。

关于内存管理功能的第 7.22.3p1 节指出:

... 已分配对象的生命周期从分配开始 直到释放...

以及定义对象生命周期的第 6.2.4p2 节:

对象的生命周期是程序的一部分 保证保留存储的执行 为了它。一个对象存在,有一个常量地址,并且保留 其在其整个生命周期中的最后存储价值。如果一个对象是 在其生命周期之外引用,行为是未定义的。 当指针指向的对象时,指针的值变得不确定 to(或刚刚过去)达到其生命周期的终点。

【讨论】:

    猜你喜欢
    • 2011-10-28
    • 2018-10-11
    • 2021-09-05
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 2012-02-21
    • 1970-01-01
    相关资源
    最近更新 更多