c - 在 Linux 上的 valgrind 中有内存泄漏的 C 程序,但我已经从 malloc() 中释放了内存

标签 c linux memory memory-leaks valgrind

我正在为一个真正的应用程序项目编写 C++ 程序。

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

我得到了:

10个 block 中的160个字节肯定丢失在丢失记录1 of 2中 ==14312== 在 0x4A0846F:malloc (vg_replace_malloc.c:236)

但是,我调用了 free() 来释放它。

如何解决?为什么我有内存泄漏?

任何帮助将不胜感激。 !

代码如下:

#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。在释放数组之前,您需要先释放数组中的 aliasID 指针:

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

关于c - 在 Linux 上的 valgrind 中有内存泄漏的 C 程序,但我已经从 malloc() 中释放了内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10292632/

相关文章:

c - 将 int 转换为数组的最佳方法

C - fscanf,格式问题

linux - x86-64 asm 中的函数参数

c - Solaris 中 prstat SIZE 值增加是否表示内存泄漏?

python - 如何将数组存储在太大而无法加载到内存中的 hdf5 文件中?

c - GDB,检查指向指针的指针

C - 写入 4 个字节,但随后仅将指针递增 3

linux - LINUX 中出现内存故障错误,但 UNIX 中没有

c++ - 在Linux上广播IPC

ruby - 如何逐行读取大文本文件并将此流逐行附加到 Ruby 中的文件?