Linux上valgrind中存在内存泄漏的C程序,但我已从malloc()中释放了mem 我正在为一个实际应用项目做C++程序。
我使用valgrind进行内存泄漏检查 我得到: 10个块中的160字节肯定会在丢失记录1(共2个)中丢失 ==14312==at 0x4A0846F:malloc vg\u replace\u malloc.c:236 但是,我已经打电话免费发布了它 如何修复它?为什么我有内存泄漏 任何帮助都将不胜感激 代码如下: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
#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返回的内存我在这里没有看到任何C++。也许你想用C++来重新绑定C++标签?抱歉,我已经更改了C标签。谢谢首先,您可能需要重新考虑您的设计,因为使用三重间接寻址是非常不寻常的。另外,在调用malloc时,尝试始终使用sizeof varName而不是sizeof type.int*ids=mallocsizeofint*8;这样更好。Cast是不需要的,它会使一些错误变得不可见。@Robert S.Barnes,为什么要使用var而不是var type?使用var而不是var类型有什么好处吗?我已经根据您使用realloc的引用释放了内存。必须释放在GetNextAlias函数中分配的内存