【问题标题】:does free() follow pointers?free() 是否跟随指针?
【发布时间】:2012-12-02 09:18:12
【问题描述】:

我确定不是,但也许其中有黑魔法,所以这是我的问题:

如果我有这样的结构:

struct mystr {
    char * strp,
    unsigned int foo,
};

我为它分配内存并想稍后释放它。我必须这样做吗

free(mystr_var->strp);
free(mystr_var);

或者最后一行是否足够,free() 函数是否跟随指针并释放它们两个?

【问题讨论】:

标签: c pointers struct malloc free


【解决方案1】:

不,它没有。

这根本不是魔法,对编译器来说它只是另一个函数调用。

问问你自己,你将如何以遵循指针的方式实现void free(void *);,当然不会被包含任何东西的二进制数据块所愚弄。你不能。

【讨论】:

    【解决方案2】:

    没有。它只是释放指向的块。

    您需要显式释放引用的内存。您需要先执行此操作(即很可能与分配内存的方式相反)

    【讨论】:

      【解决方案3】:

      不,free 不跟随指针,你需要这两行。

      我通常会写这样的函数:

      void freemystr(mystr *mystr_var)
      {
          if (mystr_var)
          {
              free(mystr_var->strp);
              mystr_var->strp = NULL;
              free(mystr_var);
          }
      }
      

      【讨论】:

        【解决方案4】:

        没有。 free 不会为所有成员免费递归。您必须显式释放已分配内存的所有成员。

        如果您了解如何为 struct 分配内存以及 free 是如何工作的,这将不是问题。

        struct mystr {
            char * strp,
            unsigned int foo,
        };
        

        当您使用 malloc 和朋友分配内存时,它只为成员分配内存。 在您的情况下,一个char* 和一个unsigned int。请注意,它不会分配任何内存来存储char* 中的数据。所以你必须在存储数据之前再次为strp分配内存。除非您直接分配字符串文字或仅使用指针strp 指向现有内存。

        示例:

        案例 1:

        struct mystr s;
        
        s.strp = "literals"; // valid, no need to malloc
        

        案例 2:

        char *p="abc";
        
        s.strp = p; // valid, no need to malloc
        

        在所有其他用途中,您必须先为strp 分配内存,然后再将数据存储到strp

        所以当你在结构变量上调用free 时,它只会释放分配给strp 的指针,而不是strp 指向的内存。 这仅仅是因为free 没有关于strp 指向何处的信息。

        请注意,在上面的两个示例中,您没有释放strp,因为您没有在那里分配任何内存来将数据存储到strp。简单的规则是一对一malloc/calloc/realloc

        【讨论】:

          【解决方案5】:

          必须单独释放每个单独分配的内存块。 free() 只会释放指针指向的内存块,它不知道该内存的内容是什么。

          因此,在您的情况下,您的做法是正确的,首先释放结构中分配的最里面的内存,最后释放结构指针。

          如果你只是在结构指针上做free,结构内存就会被释放。 char* strp 持有的内存在您的程序生命周期内成为内存泄漏。

          【讨论】:

            【解决方案6】:

            C99 说,

            free 函数导致 ptr 指向的空间被释放,也就是说,可用于进一步分配。如果 ptr 是空指针,则不会发生任何操作。否则,如果参数与 calloc、malloc 或 realloc 函数先前返回的指针不匹配,或者如果空间已通过调用 free 或 realloc 被释放,则行为未定义。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2021-11-03
              • 2012-02-21
              • 1970-01-01
              • 1970-01-01
              • 2019-09-08
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多