【问题标题】:Memory Leak with valgrindvalgrind 的内存泄漏
【发布时间】:2013-04-06 17:06:56
【问题描述】:

这可能最终成为一个愚蠢的问题。我做了以下功能:

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*));

【问题讨论】:

    标签: c valgrind


    【解决方案1】:

    根据我使用 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 是一种解决方法。内容未知,很可能没有.there,使得while条件评估为假,没有非法访问。

    我建议要么确保 . 出现在最终迭代中,要么在您的 while 条件中包含类似 i &lt; ROWS 的内容

    【讨论】:

    • 好地方-我的“答案”确实是一种解决方法-更多的是试图理解我无法整齐地发表评论的问题。我已将其删除,因为它对问题没有任何帮助。
    猜你喜欢
    • 2013-06-24
    • 2020-03-31
    • 2016-03-15
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    相关资源
    最近更新 更多