c - 如何在 C 中正确释放 char*** 内存,这样我就不会发生内存泄漏

标签 c memory-management memory-leaks

我得到了以下代码

int rows = 123;
int cols = 12;
char ***data = (char ***)malloc(rows * sizeof(char **));
if(data) {
    for(int i = 0; i < num_rows; i++)
    {
        data[i] = (char **)malloc(cols * sizeof(char *));
        if(!data[i])
        {
            for(int j = 0; j < i; j++)
                free(data[j]);
            free(data);
            printf("no memory\n");
            return -1;
        }
    }
}
char randomData[] = "<Inserts random string here everytime>";
for(int row = 0; row < rows; row++) {
     for(int col = 0; col < cols; col++) {
         data[row][col] = (char *) malloc(sizeof(char) * (1 + strlen(randomData)));
         strcpy(data[row][col], randomData);
     }
}

我为这个 stackoverflow 写的这个例子是因为真实的代码是相似的但是 <Inserts random string here everytime>是从每个 SQL 行和每个列输出。

我只想做一个像data[row][column]这样的多维数组

完成后如何正确释放它?

我想清除它我必须先清除第一颗星。 char *

for(int row = 0; row < rows; row++) {
     for(int col = 0; col < cols; col++) {
         free(data[row][col]);
     }
}

然后清除第二颗星char **

for(int row = 0; row < rows; row++) {
     free(data[row]);
}

然后我终于可以清除最后一个三星char ***

    free(data);

你是这样做的吗?似乎免费的太多了..是

for(int row = 0; row < rows; row++) {
     for(int col = 0; col < cols; col++) {
         free(data[row][col]);
     }
}

够了吗?

最佳答案

您必须取消分配您分配的所有内容。

你最多可以通过这样写来保存一个循环:

for(int row = 0; row < rows; row++) {
     for(int col = 0; col < cols; col++) {
         free(data[row][col]);
     }
     free(data[row]);
}
free(data);

如果你想一次性取消分配,你必须一次性分配,但是对于指针数组来说这很棘手,必须用红色闪烁字体注释:

data = malloc(rows * (1 + cols) * sizeof(void *));
for (i=0; i<rows; i++) {
    data[i] = &(data[cols * i]);
}

取消分配将是:

for(int row = 0; row < rows; row++) {
     for(int col = 0; col < cols; col++) {
         free(data[row][col]);
     }
}
free(data);

如果你愿意,你可以直接分配一个二维数组:

data = malloc(rows * cols * sizeof(void *));

但是,您必须通过 data[j + i * rows] 访问各个元素...以红色闪烁字体进行注释...

关于c - 如何在 C 中正确释放 char*** 内存,这样我就不会发生内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25032863/

相关文章:

.net - 一个空的委托(delegate)会吃掉内存吗?

java - 如何使用 OQL 查找堆上最旧的实例

c++ - 在 C++ 中检查内存泄漏的最佳方法是什么?

python - C/Python : Undefined behavior from C code, dir() 导致 TypeError

c - 在定点计算中使用小数部分

c - 谁响应内存管理用malloc()

javascript - promises 和 closures 是否消耗了我所有的内存?

java - SLF4J MDC 内存泄漏

C 函数参数,内存对齐注意事项

c - scanf GCC for long double