C中的函数free()对我不起作用

mad*_*per -2 c malloc free std

我一直试图释放通过malloc()使用分配的内存free().

它的一些结构是免费的,但它们保留了它们的方式,它们也与它们的孩子保持联系.它也永远不会释放(gRootPtr)二叉树的根.

我正在使用Xcode来查明二叉树使用的内存是否已被释放,并使用if语句.

我用来释放内存的代码:

void FreeMemory(InfoDefiner *InfoCarrier)
{
    if ((*InfoCarrier) != NULL) {
        FreeMemory((&(*InfoCarrier)->left));
        FreeMemory((&(*InfoCarrier)->right));
        free((*InfoCarrier));
    }
}
Run Code Online (Sandbox Code Playgroud)

代码我用来查看内存是否已被释放.

if (gRootPtr != NULL) {
    return 1;
}
else{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

bdo*_*lan 16

首先,free不会改变指针本身.

void *x = malloc(1);
free(x);
assert(x != NULL); // x will NOT return to NULL
Run Code Online (Sandbox Code Playgroud)

如果希望指针返回NULL,则必须自己执行此操作.

其次,没有关于free之后指针所指向的内存会发生什么的保证:

int *x = malloc(sizeof(int));
*x = 42;
free(x);
// The vlaue of *x is undefined; it may be 42, it may be 0,
// it may crash if you touch it, it may do something even worse!
Run Code Online (Sandbox Code Playgroud)

请注意,这意味着您无法实际测试是否free()有效.严格地说,free()通过绝对不做任何事情来实现是合法的(当然,如果情况确实如此,那么你最终会耗尽内存).


Die*_*lla 5

该检查不会检查变量是否被释放.请注意,free(pointer)不会将该指针设置为NULL.如果你想要这样,你必须自己设置它,这是C中常见的习语:

free(pointer);
pointer = NULL;
Run Code Online (Sandbox Code Playgroud)

表示你已经释放了那个指针.