当我动态分配一个结构,然后尝试释放它时,它似乎重新分配了它。
typedef struct OBJ_T
{
int param1, param2;
} OBJ;
OJB* Construct(int par1, int par2)
{
OBJ* x = malloc(sizeof(OBJ));
x->param1 = par1;
x->param2 = par2;
return x;
}
void freeup(OBJ *x)
{
printf("x pointer -> %d ", x);
free(x);
x=NULL;
printf("\nx pointer -> %d\n", x);
}
int main()
{
OBJ foo = *Construct(10, 20);
freeup(&foo);
freeup(&foo);
return 0;
}
结果是:
x pointer -> 2752216
x pointer -> 0
x pointer -> 2752216
x pointer -> 0
因此,在释放并清空指针后,如果我再次检查它,它会恢复到原来的状态。那是问题吗?还是它是免费的,我再也不用担心了?
最佳答案
首先,这一行是在堆栈上分配foo
,然后将动态分配的结构复制到这个地方:
OBJ foo = *Construct(10, 20);
当然,你不应该释放它。正确的情况是:
OBJ* foo = Construct(10, 20);
. . .
freeup(foo);
其次,如果要清除freeup
中的指针,则将参数类型更改为pointer-to-pointer:
void freeup(OBJ** x)
{
free(*x);
*x=NULL;
}
...在这种情况下,您应该将 freeup
调用更改为 freeup(&foo);
。
最后,foo
似乎在您的代码中被重新分配,但它不能被释放或分配,它是一个堆栈变量。所以指向 foo
的指针在函数内部总是相同的。
关于c - 释放指针重新分配自身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32741154/