C 释放指向指针的指针

标签 c pointers free

在我的代码中,我有几个指向指针的指针(例如 float ** 变量),而且我似乎在释放它们的内存时遇到了问题,以免导致内存泄漏。这是我编写的代码:

float *one, **part1, **part2;

one = malloc(sizeof(&one) * nx * nx);
part1 = malloc(sizeof(&part1) * nx);

if(one == NULL || part1 == NULL) {
 printf("Memory error.\n");
 exit(2);
}

for(k = 0; k < nx; k++)
 part1[k] = &one[k * nx];

one = malloc(sizeof(&one) * nx * nx);
part2 = malloc(sizeof(&part2) * nx);

if(one == NULL || part2 == NULL) {
 printf("Memory error.\n");
 exit(2);
}

for(k = 0; k < nx; k++)
 part2[k] = &one[k * nx];

... (Other code here)

for(k = 0; k < nx; k++) {
 free(part1[k]);
 free(part2[k]);
}

free(one);
free(part1);
free(part2);

这段代码贯穿始终,计算正确,但随后在自由循环中出错。它适用于 k = 0,但随后在尝试释放 part1[1] 和 part2[1] 时,它给了我“glibc detected”错误。

最佳答案

首先:

one = malloc(sizeof(&one) * nx * nx);
part1 = malloc(sizeof(&part1) * nx);

这些应该是

one = malloc(sizeof(*one) * nx * nx);
part1 = malloc(sizeof(*part1) * nx);

您想分配一堆 floatfloat *,而不是 float **float ** *

其次,您进行了 4 次分配——您分配了 一个,并在 part1 中对其进行了索引, 并再次分配 one(忘记旧地址),并在 part2 中对其进行索引。

这意味着您应该有 4 个 free():part1part2,以及两个内存块,其中 一个 指出。因为您覆盖了第一个 one,所以您丢失了该指针并且不能直接 free() 它。幸运的是,您确实将该指针保存在 part1[0] 中,并且可以使用它来 free() 所有指向的内存。

另一个(可能更清晰和更惯用的)选项是分配不同的方式。分配part1,然后循环分配每个part1[k]part2也是如此。

关于C 释放指向指针的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4355172/

相关文章:

c - 如果我尝试在 C 中将一个数组复制到另一个数组中,则会出现错误消息

c - 在 C 中通过 TCP/IP 发送和接收字节数组

c - 初始化 char 数组的推荐程序是什么?

c - 跳转表和代码指针

c - 如何在 C 中复制指针数组? (uint32_t)

c++ - *** 检测到 glibc *** free() : invalid pointer

c++ - 标准 C++ 的哪些部分将调用 malloc/free 而不是 new/delete?

html - C Linux HTML 条不工作

c - 如何正确释放链表的所有元素?

c - C中与NULL的两次相等比较