首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >释放使用malloc创建的结构,而malloc的成员也有malloc

释放使用malloc创建的结构,而malloc的成员也有malloc
EN

Stack Overflow用户
提问于 2018-11-29 07:43:45
回答 1查看 62关注 0票数 4

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

代码语言:javascript
复制
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;

然后我创建了这样的向量:

代码语言:javascript
复制
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,我使用以下方法:

代码语言:javascript
复制
void cvector_free(cvector vector) {
    free(vector);
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-29 08:01:06

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

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

代码语言:javascript
复制
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的最后一个成员。

然后,以这样的方式保留空间:

代码语言:javascript
复制
cvector cvector_create() {
    cvector retval = malloc(sizeof(struct cvector) + (sizeof(int) * 8));
    retval->capacity = 8;
    retval->size = 0;
    return retval;
}

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53534077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档