【发布时间】:2017-04-09 08:16:22
【问题描述】:
我在分配到一个结构后遇到了内存泄漏
struct List {
struct node fNode;
};
struct node {
int key;
};
void listInit(struct List * fList)
{
struct node * temp = malloc(sizeof(struct node));
nodeInit(temp); // set value or something
fList->fnode = *temp;
}
void listEmpty(struct List * flist)
{
nodeEmpty(&flist->fnode);
memset(&flist->fnode, 0, sizzeof(struct node);
free(&flist->fnode);
}
我没有意识到 &flist->fnode 地址与 malloc 返回的临时地址不同。如何从结构列表再次访问地址?而且我不能将属性更改为指针,它必须是结构本身。
【问题讨论】:
-
This:
free(&flist->fnode)保证是错误的,因为从operator &返回的地址不可能是从 C 中的标准分配器函数生成的地址。事实上,struct List和struct node都没有指针成员。根据此代码的外观以及您陈述的问题/条件,我高度怀疑XY problem。这是为了解决什么问题? -
我需要一种从 malloc 中获取指针的方法,以便正确释放分配的结构。
-
你
List结构没有地方存储这样一个指针,你已经声明你不能改变结构(尽管我真诚地怀疑这些是“真正的”结构,因为它们就在附近- 毫无意义)。简而言之,以你所展示的,你不能从这里到达那里。除非目标是泄漏内存,否则您拥有的malloc毫无意义,因为没有地方可以保留它返回的地址。 -
那么这意味着我能做到的唯一方法就是创建新的全局变量来存储指针?
-
我不能说任何一种方式。我们仍然不知道正在解决的实际问题。 不是您在解决方案中遇到的问题;您的解决方案试图解决的实际问题。照原样(不多),有一件事是肯定的,
malloc是错误的。事实上,任何动态分配都是错误的,除非你有办法保留从它生成的地址。