[英]Valgrind reports memory leak for realloc call. But unable to understand why
我有一個結構如下:
typedef struct somefruits{
struct pine abc;
int xyz;
}pm;
struct pine
{
unsigned char *ch;
unsigned char *data;
unsigned int a;
}
int function(unsigned int nfruits, pm **outfruits)
{
pm *fruits = NULL;
status = 0;
void *tmp = NULL;
tmp = realloc(fruits, (nfruits + 1) * sizeof *fruits);
if (tmp != NULL)
fruits = tmp;
//do some manipulations on fruits. malloc and assign values for ch and data;
for (i =0 ;i<nfruits;i++)
{
// do some stuff
fruits[i]->abc.data = malloc(20);
//write some stuff into data
fruits[i]->abc.ch = malloc(100);
//write some stuff into ch
}
//do manipulations which can result in change of status variable
*outfruits = fruits;
return status;
}
int main ()
{
pm *Fmain;
function(10, &Fmain);
// do some stuff with Fmain
dispose(Fmain, 10);
}
dispose(pm *object, int n)
{
for(i=0;i<n;i++)
{
free((object+i)->abc.ch);
free ((object+i)->abc.data);
}
free (object);
}
當我在以下代碼上運行valgrind時,我得到
HEAP SUMMARY:
==4699== 421 (352 direct, 69 indirect) bytes in 1 blocks are definitely lost in loss record 3 of 4
==4699== by 0x4A079DA: realloc
==4699== by 0x40A065: function (file1.c:623)
第623行指向tmp = realloc(fruits, (nfruits + 1) * sizeof *fruits)
行
由於我要釋放內存以進行處置,因此我無法理解我做錯了什么。 任何幫助都感激不盡。
真的並不難。 該代碼可以干凈地編譯; 它也可以在valgrind
下正常運行。 請注意,與其他問題相比,與該問題相比, struct pine
和struct somefruit
struct pine
的定義必須顛倒。
#include <stdlib.h>
struct pine
{
unsigned char ch;
unsigned char data;
unsigned int a;
};
typedef struct somefruits
{
struct pine abc;
int xyz;
} pm;
void function(unsigned nfruits, pm **outfruits);
void dispose(pm * object);
void function(unsigned nfruits, pm **outfruits)
{
pm *fruits = malloc((nfruits + 1) * sizeof *fruits);
if (fruits != NULL)
{
for (unsigned i = 0; i < nfruits + 1; i++)
{
fruits[i].xyz = i;
fruits[i].abc.ch = i + 'A';
fruits[i].abc.data = i + 'a';
fruits[i].abc.a = i + 237;
}
}
*outfruits = fruits;
}
void dispose(pm * object)
{
free(object);
}
int main(void)
{
pm *Fmain;
function(10, &Fmain);
dispose(Fmain);
return 0;
}
#include <stdlib.h>
struct pine
{
unsigned char *ch;
unsigned char *data;
unsigned int a;
};
typedef struct somefruits
{
struct pine abc;
int xyz;
} pm;
void function(unsigned nfruits, pm **outfruits);
void dispose(unsigned nfruits, pm *object);
void function(unsigned nfruits, pm **outfruits)
{
pm *fruits = malloc((nfruits + 1) * sizeof *fruits);
if (fruits != NULL)
{
for (unsigned i = 0; i < nfruits + 1; i++)
{
fruits[i].xyz = i;
fruits[i].abc.ch = malloc(20);
fruits[i].abc.data = malloc(20);
fruits[i].abc.a = i + 237;
if (fruits[i].abc.ch != 0)
fruits[i].abc.ch[0] = '\0';
if (fruits[i].abc.data != 0)
fruits[i].abc.data[0] = '\0';
}
}
*outfruits = fruits;
}
void dispose(unsigned nfruits, pm *object)
{
for (unsigned i = 0; i < nfruits + 1; i++)
{
free(object[i].abc.ch);
free(object[i].abc.data);
}
free(object);
}
int main(void)
{
pm *Fmain;
function(10, &Fmain);
dispose(10, Fmain);
}
廢話加上nfruits + 1
絕對是危險的。 代碼是一致的,但是+1
並不是很好的設計。 該代碼也具有來自valgrind
的干凈衛生單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.