gpt4 book ai didi

尽管免费,但 C 内存泄漏

转载 作者:IT王子 更新时间:2023-10-28 23:33:33 25 4
gpt4 key购买 nike

在使用 Valgrind 调试我的程序时,我发现了内存泄漏,尽管我认为这是对 free 的有效调用。首先,分配内存并存储它的代码:

    row = malloc(sizeof(Row));
row->columns = malloc(sizeof(char*) * headcnt);
row->numcol = 0;

...

row->numcol = colcnt;
rows = realloc(rows, (rowcnt+1) * sizeof(Row));
rows[rowcnt++] = *row;

负责尝试释放内存的代码:

void cleanUp(){
int i = 0;
int j = 0;

for (i = 0; i < rowcnt; i++){
for (j = 0; j < rows[i].numcols; j++){
free(rows[i].columns[j]);
}
free(&rows[i]);
}
free(rows);
exit(0);
}

Row 的声明:

typedef struct {
char** columns;
unsigned short int numcol;
} Row;

Row* rows = NULL;

更糟糕的是,这个程序有时会在 free(&rows[i]) 处导致一个 glibc 错误,该错误提示双重释放。我是 C 新手,希望有人能提供任何指点(咳咳)。

最佳答案

执行 rows[rowcnt++] = *row; 可以有效地复制您分配的内存。您的数组行应该是一个指针数组。同样就像 Oli Chalesworth 指出的那样,您对列的免费应该是对所有列的一次免费。

rows = malloc(count * sizeof(Row*)); // This is probably done somewhere

row->columns = malloc(sizeof(char*) * headcnt);
row->numcol = 0;

...

row->numcol = colcnt;
rows = realloc(rows, (rowcnt+1) * sizeof(Row*));
rows[rowcnt++] = row;

现在如果你的清理工作

void cleanUp(){
int i = 0;
int j = 0;

for (i = 0; i < rowcnt; i++){
free(rows[i]->columns);
}
free(rows);
exit(0);
}

关于尽管免费,但 C 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4934245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com