簡體   English   中英

C 內存泄漏與 char **

[英]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.

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