[英]C Memory leaks with char **
我正在玩 C malloc 和免費工具,我有一個奇怪的內存泄漏。 有人對此有想法嗎?
目標是成功釋放一個字符**。
所以在函數凍結器中,我釋放了 char** 中的每個 char*,而 i 釋放了 char**。
但是 Valgrind(我在 linux 上的泄漏檢測器)發現 4 個塊中有 20 個字節泄漏(我不知道我是否可以寫“泄漏”XD)更有趣的部分是,如果我通過添加一個 char* 來做一個更大的 char**在其中,它在另一個塊中泄漏了另外 5 個字節的內存:/。
#include <stdio.h>
#include <stdlib.h>
void freezer(char ***array, int length){
int i;
i = -1;
while (*array[++i] != NULL){
free(*array[i]);
}
free(*array);
}
int main(){
char **big;
int len = 4;
int i;
big = malloc(sizeof(char *) * (len + 1));
i = -1;
while (++i < len){
big[i] = malloc(sizeof(char) * 5);
big[i][0] = 't';
big[i][1] = 'e';
big[i][2] = 's';
big[i][3] = 't';
big[i][4] = '\0';
}
big[i] = NULL;
i = -1;
while (++i < len){
printf("i: %d\t%s\n", i, big[i]);
}
freezer(&big, len);
return (0);
}
您可以直接復制/過去/運行代碼。
因此,如果您對錯誤/C 問題有任何線索,請告訴我。
big[i] = NULL;
導致緩沖區溢出。 您只為總共len
個條目分配了空間,再加上一個字節; 但那時i == len
。
也許你的意思是big = malloc(sizeof(char *) * (len + 1));
此外, freezer
函數會取消引用並釋放錯誤的東西。 要么將其更改為接受char **array
,要么在函數內用(*array)
替換所有出現的array
。 前者更可取,無需通過引用傳遞即可調用free
。
你的循環結構很奇怪,沒有明顯的原因; 使用是正常的:
for (i = 0; i < len; ++i)
這是相同的邏輯,但會使您的代碼更容易被閱讀的人消化。
另外, 不要施放 malloc
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.