【问题标题】:Do I have to free an array inside a struct?我必须释放结构内的数组吗?
【发布时间】:2012-01-02 05:49:12
【问题描述】:

如果我有一个结构:

struct Rec
{
    uint16_t vals[500];
};


Rec * prec = malloc(sizeof(Rec));
//Rec * prec = (Rec *) malloc(sizeof(Rec)); This code was my original and is incorrect.
//                                          See Below for details.

// initialize everything in vals

这段代码是否足以释放所有使用的内存?

free(prec);

或者我必须单独free 数组吗?

【问题讨论】:

标签: c memory struct


【解决方案1】:

这就够了。
您没有单独分配数组,因此只需释放分配的指针就足够了。

遵守规则:
您应该只在malloc 返回给您的地址上调用free,否则将导致未定义行为。

参考:
c99 标准:7.20.3.2 free 函数

概要
#包括
void free(void *ptr);

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

退货
free 函数不返回任何值。

【讨论】:

    【解决方案2】:

    在他们之前的回答中,tekknolagi 和 Als 都是正确的。如果您尝试执行此代码 sn-p,它可能有助于说明正在发生的事情。

    // cc -o test test.c
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdint.h>
    
    struct rec {
        uint16_t vals[500];
    };
    
    int main (int argc, char const *argv[])
    {
        printf("struct rec is %ld bytes.\n", sizeof(struct rec));
    
        struct rec* rec_p = (struct rec*)malloc(sizeof(struct rec));
        free(rec_p);
    }
    

    当你执行这段代码时,你会看到:

    struct rec is 1000 bytes.
    

    您只给malloc 打过一次电话。该调用分配了结构定义所描述的所有空间。匹配的free 同样会释放所有这些内存。

    【讨论】:

      【解决方案3】:

      只有在使用malloc(或空指针)时才使用free

      意思是退出时会自动释放。


      如果你有malloced 就足够了。

      【讨论】:

        【解决方案4】:
        Rec * prec = (Rec *) malloc(sizeof(Rec));
        

        感谢您将分配包含在 cmets 中(我将其编辑到问题中,希望我没看错)。

        如您所料,要释放malloc(3) 分配的内存,请使用free(3)。

        但请注意,如果您使用#include &lt;stdlib.h&gt;,则无需将(Rec *) 与malloc(3) 一起使用。头文件中提供的函数原型让编译器为您找出强制转换。包括标题并删除演员表。

        【讨论】:

        • 事实上,在某些情况下,投射malloc() 的结果可以隐藏错误。
        • 我不知道那个。标准库。感谢您的提示并澄清我的问题
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-07
        • 2016-10-20
        • 1970-01-01
        • 1970-01-01
        • 2019-08-20
        相关资源
        最近更新 更多