c - 释放使用 malloc 创建的结构,其成员也有一个 malloc

标签 c memory memory-management malloc

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

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;

然后我像这样创建这个 vector :

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 就够了吗?

最佳答案

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

如果你在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 在同一个 block 上。

关于c - 释放使用 malloc 创建的结构,其成员也有一个 malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53534077/

相关文章:

iphone - 使用 Cocoa 和 Objective-C 理解引用计数

c - C 中的静态和动态内存何时分配和取消分配?

c - 如何使用原始套接字在 C 中接收 ICMP 请求

c - 意外输出(C 字符串和字符)

memory - 内存映射中的 R0 和 R1 寄存器在哪里?

c++ - 如何保持指针在 vector 中有效,指向其他 vector 中的项目

iOS - 在使用成功 block 进行异步网络调用时查看 Controller 内存管理

c++ - 用于将 weak_ptr 应用于 unique_ptr 的内容

c - 如何在 C 中使用 for - while 循环制作领结形状

c - 简单 MPI 发送/接收程序中的行为不明确