realloc奇怪的内存泄漏

时间:2015-03-07 12:47:42

标签: c memory-leaks valgrind realloc

我有一棵n-ary树:

struct node {
    char *data;
    int numofkids;
    struct node **kids;
}

和一个功能:

addToParent(struct node *parent, struct node *kid);

将孩子附在父母身上。

每次我想要添加一个新孩子时,我都是通过重新分配父亲的孩子阵列来做到这一点。

身体:

  parent->numofkids ++;
  parent->kids = realloc(parent->kids, parent->numofkids * sizeof(char *));
  parent->kids[(parent->numofkids) - 1] = kid;

我使用valgrind --leak-check = yes ./myprog运行我的程序,它显示了addToParent函数的realloc函数的内存泄漏。这意味着我必须释放()某些东西?但是什么?我不是要删除孩子,我只是将给定的孩子添加到给定的父母。

Valgrind的:

Valgrind output

2 个答案:

答案 0 :(得分:0)

使用realloc()的正确方法是

struct node * temp = realloc(parent->kids, parent->numofkids * sizeof(char *));
if(temp != NULL)
parent->kids = temp;
else
{
 /* take necessary action when allocation fails */
}

由于realloc()可能会失败,如果失败,您将在realloc()来电之前丢失原始数据。使用内存完成后,您需要free()

答案 1 :(得分:0)

在该代码或代码调用代码中存在许多潜在的问题(您还没有显示)。

首先,分配的大小应该与正在分配的对象的大小相关。不是sizeof(char *)的倍数。

其次,realloc()如果失败则返回NULL,并且应该检查它,而不是假设它成功。

基于这些,你需要做这样的事情

struct node **temp = realloc(parent->kids, (parent->numofkids+1)*sizeof(*temp));
if (temp != NULL)
{
    parent->kids = temp;
    ++parent->numofkids;
    parent->kids[parent->numofkids - 1] = kid;
}
else
{
     /*  reallocation failed, so leave the pointers alone and complain bitterly */
}

要检查的其他事项;

  1. 由于您正在传递指向struct node的指针,请检查传递的对象是否有效(例如,它不是未初始化的指针),以及调用者在完成时是否释放它。
  2. 在第一次调用函数之前检查parent是否指向某个值,并在程序结束之前释放它。
  3. 在程序结束前检查您动态分配(或重新分配)的所有内容是否已实际发布。