程序中的Mem泄漏? C

时间:2017-02-25 07:00:57

标签: c memory valgrind

动态分配一个cstrings数组来分隔传递它的字符串。 Valgrind说我有7个分配但只有3个自由。但我不确定如何在使用返回数组的函数时释放内存。

这是函数

char ** func( char * str, char del ) {
     char** substrings;
     char* word;
     int len = 0, capacity = 2, i, x;
     substrings = malloc(sizeof(char*) * (capacity + 1));
     for (i = 0; i <= capacity; i++){
         substrings[i] = NULL;
     }
     while (*word != '\0') {
         if (len  >= capacity){
             /* double size */
             char **temp;
             capacity *= 2;
             temp = malloc(sizeof(char*) * (capacity + 1));
             for (i = 0; i < len; i++) {
                 temp[i] = substrings[i];
             }
             for (i = len; i <= capacity; i++) {
                 temp[i] = NULL;
             }
             substrings = temp;

             temp = NULL;
             free(temp);

         }
     }     
     return substrings;
 }

2 个答案:

答案 0 :(得分:0)

从您的代码中

if (len  >= capacity){
         /* double size */
         char **temp;
         capacity *= 2;
         temp = malloc(sizeof(char*) * (capacity + 1));
         for (i = 0; i < len; i++) {
             temp[i] = substrings[i];
         }
         for (i = len; i <= capacity; i++) {
             temp[i] = NULL;
         }
         free(substrings); // release old memory
         substrings = temp; // this line causes substrings pointer leak if you assign new address to it without free

         temp = NULL;
         free(temp); // no need free NULL

     }

实际上,如果您将 valgrind - track-originins = yes 选项一起使用,它将报告该线路正在泄漏。

答案 1 :(得分:0)

两件事。 1)我认为您提供的程序不是您在申请中使用的程序。我看到多个问题,例如,word未初始化。

2)正如其他人指出的那样,问题是因为你为指针分配NULL然后释放它。

从代码中看起来您正在尝试执行以下操作。

         for (i = len; i <= capacity; i++) {
             /* Your code */
         }

         /* Free the previous substring. */
         if(NULL != substrings){
             free(substrings);
         }

         /* Save newly allocated temp as substring. */
         substrings = temp;

         /* Clear temp variable - Optional. */
         temp = NULL;