Linux上valgrind中存在内存泄漏的C程序,但我已从malloc()中释放了mem 我正在为一个实际应用项目做C++程序。

Linux上valgrind中存在内存泄漏的C程序,但我已从malloc()中释放了mem 我正在为一个实际应用项目做C++程序。,c,linux,memory,memory-leaks,valgrind,C,Linux,Memory,Memory Leaks,Valgrind,我使用valgrind进行内存泄漏检查 我得到: 10个块中的160字节肯定会在丢失记录1(共2个)中丢失 ==14312==at 0x4A0846F:malloc vg\u replace\u malloc.c:236 但是,我已经打电话免费发布了它 如何修复它?为什么我有内存泄漏 任何帮助都将不胜感激 代码如下: #include <stdio.h> #include <stdlib.h> int * GetSomeIDs() ; /*-------- GetSom

我使用valgrind进行内存泄漏检查

我得到:

10个块中的160字节肯定会在丢失记录1(共2个)中丢失 ==14312==at 0x4A0846F:malloc vg\u replace\u malloc.c:236

但是,我已经打电话免费发布了它

如何修复它?为什么我有内存泄漏

任何帮助都将不胜感激

代码如下:

#include <stdio.h>
#include <stdlib.h>
int * GetSomeIDs() ; 
/*-------- GetSomeIDs-----*/

typedef struct {
       char* alias;   /* '\0'-terminated C string */
       int   specific_id;
} aliasID;

int GetNumberOfAliases(void)
{
    return 10;
}

aliasID *GetNextAlias(void)
{
    aliasID *p = (aliasID *) malloc(sizeof(aliasID)) ;
    p->alias = "test alias";
    p->specific_id = rand();
    return p; 
}

int *GetSomeIDs2(aliasID  ***a, int *aIDsize , int *idSize)
{
    int  *ids  = (int *) malloc(sizeof(int) * 8) ;  
    *idSize = 8 ; 
    int length = GetNumberOfAliases();
    *aIDsize = length ;
    int i  ;
    *a = (aliasID**) malloc(sizeof(aliasID*)*length) ;

    for(i = 0 ; i < length ; ++i)
    {
        (*a)[i] = GetNextAlias();
    }

    return  ids; 
}

void callGetSomeIDs()
{
    aliasID  **aD = NULL;
    int mySize = -1; 
    int myidSize = -1; 
    int *pt = NULL;
    pt = GetSomeIDs2(&aD, &mySize, &myidSize); 
    if (!pt || !aD || mySize <= 0 || myidSize <= 0)
    {
        printf("there is a runt time error of GetSomeIDs \n");
        if (!pt && aD)
        {
            printf("there is a runt time error of GetSomeIDs pt is NULL \n");
            free(aD);
        }
    if (!aD && pt)
        {
            printf("there is a runt time error of GetSomeIDs aD is NULL \n");
            free(pt);
        }
        if (!pt && !aD)
        {
            printf("there is a runt time error of GetSomeIDs aD and pt all NULL \n");
        }

        exit(1);
    }
    // print out 8 int
    printf("the followings are integers  \n");
    int i ;
    for(i = 0 ; i < myidSize ; ++i )
    {
        printf("%d " , pt[i]);
    }
    printf("\n");
    // print out alias and ID 
    printf("the followings are alias and ID  \n");
    for (i = 0 ; i <  mySize   ; ++i )
    {
        printf( "alias is  %s " , (*aD[i]).alias) ;   
            printf( "specific_id is  %d", (*aD[i]).specific_id) ;
        printf("\n") ;
    }

    free(pt);
    free(aD);
  }

  int main()
  {

      callGetSomeIDs();

      return 0; 
   }
可以释放aliasID结构的数组,但不能释放数组中已分配的项

编辑:

首先分配一个aliasID指针数组,然后为数组中的每个条目分配实际的aliasID。在释放数组之前,需要先释放数组中的别名ID指针:

for (int i = 0; i < length_of_array; i++)
    free(aD[i]);
free(ad);

不是100%确定,但是如果您的代码在GetSomeIDs2之后输入if,那么您将执行exit1,这样您的free将无法运行


您也不会释放从GetNextAlias返回的内存