C语言中创建vector引发内存泄漏问题求助
C语言Vector实现的内存泄漏问题修复
问题描述
我尝试在C语言中实现vector,结构体声明如下:
#define VECT_INITIAL_CAPACITY 4 typedef struct vect vect_t; struct vect { char **data; // data是字符串数组 unsigned int size; unsigned int capacity; };
创建空vector的构造函数代码:
vect_t *vect_new() { vect_t *v = (vect_t*) malloc(sizeof(vect_t)); if (v == NULL) { return NULL; } // 为data分配内存 v->data = (char**) malloc(VECT_INITIAL_CAPACITY * sizeof(char*)); if (v->data == NULL) { return NULL; } for (int i = 0; i < VECT_INITIAL_CAPACITY; i++) { v->data[i] = NULL; } // 初始化字段 v->size = 0; v->capacity = VECT_INITIAL_CAPACITY; return v; }
Valgrind提示v->data = (char**) malloc(VECT_INITIAL_CAPACITY * sizeof(char*));这一行存在内存泄漏,我不清楚原因,请问该如何修复?
补充的清理函数代码:
/** 释放vector的所有内存。 */ void vect_delete(vect_t *v) { // 先释放data中的字符串 for (int i = 0; i < v->size; i++) { free(v->data[i]); } // 释放vector结构体 free(v); }
泄漏原因与修复方案
泄漏原因
- 清理函数遗漏
v->data数组的释放:v->data是通过malloc单独分配的指针数组,你的清理函数只释放了数组中存储的字符串指针和vect_t结构体,漏掉了v->data本身的释放,这是Valgrind提示的直接泄漏点。 - 构造函数存在潜在泄漏:如果
v->data的malloc调用失败,此时已经成功分配的vect_t结构体v没有被释放,会导致另一个隐藏的内存泄漏。
修复后的代码
修复构造函数
vect_t *vect_new() { vect_t *v = (vect_t*) malloc(sizeof(vect_t)); if (v == NULL) { return NULL; } // 为data分配内存 v->data = (char**) malloc(VECT_INITIAL_CAPACITY * sizeof(char*)); if (v->data == NULL) { // 分配失败时,先释放已分配的v,避免泄漏 free(v); return NULL; } for (int i = 0; i < VECT_INITIAL_CAPACITY; i++) { v->data[i] = NULL; } v->size = 0; v->capacity = VECT_INITIAL_CAPACITY; return v; }
修复清理函数
/** 释放vector的所有内存。 */ void vect_delete(vect_t *v) { if (v == NULL) { return; // 增加空指针判断,避免非法访问 } // 释放data中的每个字符串 for (int i = 0; i < v->size; i++) { free(v->data[i]); } // 释放data指针数组本身 free(v->data); // 释放vector结构体 free(v); }
内容的提问来源于stack exchange,提问作者d0nut
相关产品推荐
相关产品推荐

