簡體   English   中英

C釋放指針的指針

[英]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()part1part2one指向的兩個內存塊。 因為您覆蓋了第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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM