代码之家  ›  专栏  ›  技术社区  ›  dreamcrash

valgrind内存泄漏

  •  1
  • dreamcrash  · 技术社区  · 11 年前

    这也许是个愚蠢的问题。我完成了以下功能:

    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来查找内存泄漏(这是我第一次使用valgriund)。

    我得到以下错误:

    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(数据c:24):

    char **aux = malloc(rows * sizeof(char*));
    
    1 回复  |  直到 11 年前
        1
  •  2
  •   Cristiano Sousa    11 年前

    根据我在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,没有非法访问。

    我建议要么确保 . 出现在最后一次迭代中或包含类似内容 i < ROWS 在你的身体状况下