在我的代码中,我有几个指向指针的指针(例如 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);
您想分配一堆 float
和 float *
,而不是 float **
和 float ** *
其次,您进行了 4 次分配——您分配了 一个
,并在 part1
中对其进行了索引,
并再次分配 one
(忘记旧地址),并在 part2
中对其进行索引。
这意味着您应该有 4 个 free()
:part1
、part2
,以及两个内存块,其中 一个
指出。因为您覆盖了第一个 one
,所以您丢失了该指针并且不能直接 free()
它。幸运的是,您确实将该指针保存在 part1[0]
中,并且可以使用它来 free()
所有指向的内存。
另一个(可能更清晰和更惯用的)选项是分配不同的方式。分配part1
,然后循环分配每个part1[k]
,part2
也是如此。
关于C 释放指向指针的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4355172/