[英]C freeing pointer to pointer
在我的代碼中,我有多個指向指針的指針(例如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”錯誤。
首先:
one = malloc(sizeof(&one) * nx * nx);
part1 = malloc(sizeof(&part1) * nx);
這些應該是
one = malloc(sizeof(*one) * nx * nx);
part1 = malloc(sizeof(*part1) * nx);
您要分配一堆float
s和float *
s,而不是float **
s和float ***
s
其次,進行4次分配-在part1
分配one
,並在one
分配索引,然后在part2
再次分配(忘記舊地址),並在one
分配索引。
這意味着您應該有4個free()
: part1
, part2
和one
指向的兩個內存塊。 因為您覆蓋了第one
指針,所以您丟失了該指針,並且無法直接使用free()
。 幸運的是,您確實將該指針保存在part1[0]
,並且可以使用它free()
所有指向的內存。
另一個(也許更清晰和慣用的)選擇是分配不同的資源。 分配part1
,然后循環以分配每個part1[k]
,並為part2
分配相同的對象。
您只有4個malloc
調用,因此您應該只有4個free
調用。 您從來沒有在循環中分配任何東西,那么為什么要在循環中釋放呢?
part1[k]
和part2[k]
從來沒有自己分配過,它們只是指向分配給one
的內存區域,因此您應該只釋放one
。 另外,您在這里有內存泄漏:
one = malloc(sizeof(&one) * nx * nx);
part1 = malloc(sizeof(&part1) * nx);
...
// *** You just lost the previous old pointer here *** //
one = malloc(sizeof(&one) * nx * nx);
part2 = malloc(sizeof(&part2) * nx);
您的代碼對k = 0
起作用的原因是part1[0] == &one[0] == one
,即part1[0]
實際上指向one
塊的開頭-通過釋放它,您將釋放整個塊塊。
我不確定您的sizeof
意味着什么。 我猜你想分配nx * nx
花車-如果是的話,那應該是sizeof(*one)
- *one
是浮動的,但&one
是地址one
,這是一個float **
指針。
您真的想做這樣的事情:
one1 = malloc(sizeof(*one) * nx * nx);
part1 = malloc(sizeof(*part1) * nx);
...
for(k = 0; k < nx; k++)
part1[k] = &one1[k * nx];
...
free(part1);
free(one1);
查看您正在執行多少個malloc和您正在執行多少個釋放。 數字不匹配。
通常,您不能釋放malloc結構的一部分。 您只能釋放所有內容。 因此,最后您想要的是更多類似的東西:
... (Other code here)
/* four mallocs so four frees */
free(part1[0]);
free(part2[0]);
free(part1);
free(part2);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.