【问题标题】:why free(ptr) here is not suggested approach? [duplicate]为什么这里不建议使用 free(ptr) 方法? [复制]
【发布时间】:2019-08-27 00:34:21
【问题描述】:
int x = 2;
int* ptr = &x;
free(ptr); //why is this an undefined behavior

free 将释放内存。这里*ptr 持有x 的地址。现在如果free(ptr) 指向x 的ptr 不再存在。但是如果这不是正确的方法,我会感到困惑

【问题讨论】:

  • 你没有分配它,所以你不能释放它。
  • 基本经验法则,每个(m|c|re)alloc 最终都必须跟一个free,除非您有正当理由不这样做。

标签: c


【解决方案1】:

要使用free(),重要的是只释放来自malloc()calloc()(或由realloc() 重新处理)的项目。那些(连同free())管理heap

int *p = malloc (5620);   /* allocate 5620 bytes */

   /* do something with memory at p */
   ....

free (p);

而其他指针匹配 free() 的数据类型是不够的。要释放一个不是来自malloc()的指针实际上肯定会造成严重的麻烦:立即使程序崩溃,引入一个微妙的错误,稍后会导致奇怪的结果,或者破坏一些不相关的东西.

heap 是进程内存的一个或多个区域,它为动态分配多种类型和对象实例提供空间。这些区域不必与特定的程序变量相关联;链表、树、图和其他数据结构自然保存在堆中。

【讨论】:

  • realloc()
  • 只需将5260 自身乘以几次,看看mallocing 会带给你什么:)
  • 您在帖子中添加的链接是指堆数据结构。我相信,你的意思是 - heap
  • @H.S.:谢谢,更新了。
【解决方案2】:

x 这里定义在栈上,而不是堆上。您没有使用malloc 或相关函数显式分配内存,因此无需free

【讨论】:

  • 不仅没有必要free,尝试free它有未定义的行为(可能会弄乱实现的内部数据结构)。
【解决方案3】:

在 C 中,对象可以具有自动(“堆栈”)、静态(全局)、线程本地或分配的存储。最后一种类型,分配的存储,由malloc 获得,它的生命周期与特定块/函数的执行(每个实时调用一个实例)、线程的生命周期(每个实时线程一个实例)或全局无关(一个实例,句号),而是一直存在,直到您通过将指向它的指针传递给free 来显式释放它。 free 函数只能用于已分配存储的对象;将任何其他指针传递给它会产生未定义的行为。并且将指针传递给其他类型的对象是没有意义的,因为它们的生命周期与其他事物绑定在一起,不能任意结束。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多