You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
}

泄漏原因与修复方案

泄漏原因

  1. 清理函数遗漏v->data数组的释放:v->data是通过malloc单独分配的指针数组,你的清理函数只释放了数组中存储的字符串指针和vect_t结构体,漏掉了v->data本身的释放,这是Valgrind提示的直接泄漏点。
  2. 构造函数存在潜在泄漏:如果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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 20:40:30