我有一棵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的:
答案 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 */
}
要检查的其他事项;
struct node
的指针,请检查传递的对象是否有效(例如,它不是未初始化的指针),以及调用者在完成时是否释放它。 parent
是否指向某个值,并在程序结束之前释放它。