簡體   English   中英

valgrind的內存泄漏

[英]Memory Leak with valgrind

這也許最終是一個愚蠢的問題。 我已經完成了以下功能:

char **getArrayOfStrings(int rows, int cols){
    int i;
    char **aux = malloc(rows * sizeof(char*));

    for(i = 0; i < rows; i++) 
        aux[i] = malloc(cols+1);

    return aux;
}

這將返回一個“字符串”數組,重要的代碼塊類似於:

void f(...)
{
char **arrayOfStrings;
     int i = 0;
     arrayOfStrings = getArrayOfStrings(ROWS,COLS);

     while(ch != '.' && sscanf (globalString,"%[^,|.]s", arrayOfStrings[i]) > 0)       
     {
      globalString += strlen(arrayOfStrings[i++]) + 1;    
      ch =  (*globalString-1);                  /** take the terminal characters */ 
     }

    freeMemory(&arrayOfStrings,ROWS);

}

freeMemory在哪里:

void freeMemory(char ***matrix, int size){
    int i;

    for(i = 0; i < size; i++) free((*matrix)[i]);

    free(*matrix); 

    *matrix = NULL;
}

完成我的應用程序后,我使用valgrind運行以查找內存泄漏(第一次使用valgrind)。

我得到以下錯誤:

Finding Invalid Pointer Use With Valgrind

    ==25012== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
    ==25012== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
    ==25012== Command: dist/Debug/GNU-MacOSX/app
    ==25012== 
    ==25012== Invalid read of size 8
    ==25012==    at 0x406445: f (Data.c:24)
    ==25012==    by 0x400BE3: main (main.c:27)

我不知道我缺少什么,因為函數getArrayOfStrings對我來說似乎非常好(我本可以只使用一個malloc,但這是另一個問題)。


編輯

valgrind指示的行是此f(Data.c:24):

char **aux = malloc(rows * sizeof(char*));

以我對valgrind的經驗來看,它確實表明非法訪問已完成。 但是,您的輸出似乎僅顯示與非法訪問有關的指針及其分配位置。

這意味着我們可能看錯了代碼行。

仔細查看您的while循環:

 while(ch != '.' && sscanf (globalString,"%[^,|.]s", arrayOfStrings[i]) > 0)       
 {
  globalString += strlen(arrayOfStrings[i++]) + 1;    
  ch =  (*globalString-1);                  /** take the terminal characters */ 
 }

如果由於某種原因,在最后一行ch不等於. 非法訪問將在arrayOfStrings[rows] 分配行+1是一種解決方法。 內容未知,沒有幾率. 在那里,將while條件評估為false且沒有非法訪問。

我建議要么確保. 出現在最終迭代中,或者在您的while條件中包含諸如i < ROWS

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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