【问题标题】:Using free on nested structures在嵌套结构上使用 free
【发布时间】:2018-02-26 20:48:38
【问题描述】:

如何在下一个程序中释放“v struct”?

#include <stdio.h>
#include <stdlib.h>

struct Quaternion{
  double r;
  struct Q_vec{
    double x;
    double y;
    double z;
  } v;
};

int main(void){

  struct Quaternion* q1Ptr = malloc(sizeof(struct Quaternion));
  q1Ptr->r = 1.0;
  q1Ptr->v.x = 2.0;
  q1Ptr->v.y = 2.0;
  q1Ptr->v.z = 2.0;

  printf("%s = (%f, %f, %f, %f)\n", "q1", q1Ptr->r, q1Ptr->v.x, q1Ptr->v.y, q1Ptr->v.z);

  free(q1Ptr);

  printf("%s = (%f, %f, %f, %f)\n", "q1", q1Ptr->r, q1Ptr->v.x, q1Ptr->v.y, q1Ptr->v.z);
  //Doesn't prints 'r', but prints x, y and z.

}

输出是:
q1 = (1.000000, 2.000000, 2.000000, 2.000000)
q1 = (0.000000, 2.000000, 2.000000, 2.000000)
所以,我不会删除指向 v 的指针。
还有,我的分配可以吗?

编辑:感谢您的所有回复!
这只是实际程序的一个小示例,我在释放指针后并没有尝试使用它。我只是注意到内存的持久性,想知道我是否有内存泄漏以及如何避免它。

【问题讨论】:

  • 在释放指针后使用指针是未定义的行为。
  • 您的free 没问题。但是之后访问指针不是。此外,它与您拥有嵌套结构这一事实无关。
  • 为单个结构分配动态内存是不寻常的。
  • 没有指向 v 的指针。v 嵌入在外部结构中,因此释放一个结构会释放所有内容。但正如所指出的,在释放它之后使用它是一个很大的禁忌。

标签: c malloc free


【解决方案1】:

你有一个误解。 free() 不需要清除您分配的内存内容,free() 不会更改指针 q1Ptr 指向的内存地址。 free() 只是将资源返回给操作系统(或任何分配给您的内存)。分配给该变量的值可以保持不变,并且不保证被free() 清零。在free() 调用之后您仍然看到一些您分配的值这一事实并不表示free() 调用失败。

但是,使用指向已为 freed 的内存的指针会导致未定义的行为,因为它仍然指向您已分配的内存,但不再是您可以使用或访问的内存。在你的系统中,这一次似乎没问题,但你不能依赖它。

【讨论】:

    【解决方案2】:

    你不能访问你释放后释放的变量。 free() 不会删除内存中该位置的值,它只是让系统知道您已释放它并且可以使用和覆盖它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-07
      • 2015-12-11
      • 1970-01-01
      • 2014-01-17
      • 2013-10-19
      相关资源
      最近更新 更多