【问题标题】:Freeing up struct created with malloc who's member also had a malloc释放使用 malloc 创建的结构,其成员也有一个 malloc
【发布时间】:2018-11-29 07:43:45
【问题描述】:

假设我有一个 struct 用于在 C 中实现向量,如下所示:

struct cvector {
    unsigned int size;     // indicates number of element in the vector
    unsigned int capacity; // indicates length of the array
    int* data;             // array to store the actual data
};
typedef struct cvector* cvector;

然后我像这样创建这个向量:

cvector cvector_create() {
    cvector retval = (cvector)malloc(sizeof(struct cvector));
    retval->capacity = 8;
    retval->size = 0;
    retval->data = (int*)malloc(retval->capacity * sizeof(int));

    return retval;
}

我使用malloc 为结构分配内存和为内部int 数组分配内存。

为了释放我的cvector,我使用这个:

void cvector_free(cvector vector) {
    free(vector);
}

我的问题是,我是否需要像这样单独释放内部 int 数组:free(vector->data) 还是只释放 struct 就足够了?

【问题讨论】:

    标签: c memory memory-management malloc


    【解决方案1】:

    是的,您需要freevector->data,规则是:每次调用malloc 一次调用free

    如果你是 C99 下,你可以使用灵活的数组成员:

    struct cvector {
        unsigned int size;     // indicates number of element in the vector
        unsigned int capacity; // indicates length of the array
        int data[];            // array to store the actual data
    };
    

    注意int data[]; 必须是struct 的最后一个成员。

    那么,你这样预留空间:

    cvector cvector_create() {
        cvector retval = malloc(sizeof(struct cvector) + (sizeof(int) * 8));
        retval->capacity = 8;
        retval->size = 0;
        return retval;
    }
    

    现在,调用free(vector) 就足够了,因为vectorvector->data 在同一个块上。

    【讨论】:

    • 谢谢,非常感谢。 malloc(sizeof(struct cvector) + (sizeof(int) * 8)); 部分让我有点困惑。编译器如何知道为哪些结构成员分配内存?例如,当我有一个包含多个 int 数组的结构并且我想使用您上面介绍的方法时会发生什么?
    • 因为灵活成员必须始终是最后一个成员,并且为它使用了额外的空间(8 个整数)。
    • 所以如果我有一个struct mystruct... ; int data1[]; int data2[]; int data3[]; 成员,我可以做一个malloc(sizeof(mystruct) + (sizeof(int)*10) + (sizeof(int)*10) + (sizeof(int)*10)),只要这三个成员是我的结构成员顺序中的最后一个?
    • @szenadam, nops :) struct 只能有一个灵活的数组成员。
    猜你喜欢
    • 2014-12-13
    • 2021-03-02
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多