Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中free()的异常行为_C_Pointers_Free - Fatal编程技术网

C中free()的异常行为

C中free()的异常行为,c,pointers,free,C,Pointers,Free,注意:如果问题太长或格式不适合,我深表歉意。如果不在合适的站点上,请建议该问题更适合哪个StackExchange站点。 我一直在学习有关AVL树的教程,并决定为该树添加BFS搜索。这是我的实现(它的一部分)- 现在,即使我free()函数dequeue()返回的变量也不会对我造成伤害。但是,返回的值已在其他一些函数中动态分配。它怎么不会对我的树造成任何问题?free()不应该释放分配的空间吗?我在这里以C99标准为例,这可能是您正在使用的,也可能不是。不过,它应该适用。在C99标准中,附录J.

注意:如果问题太长或格式不适合,我深表歉意。如果不在合适的站点上,请建议该问题更适合哪个StackExchange站点。

我一直在学习有关AVL树的教程,并决定为该树添加BFS搜索。这是我的实现(它的一部分)-


现在,即使我
free()
函数
dequeue()
返回的变量也不会对我造成伤害。但是,返回的值已在其他一些函数中动态分配。它怎么不会对我的树造成任何问题?
free()
不应该释放分配的空间吗?

我在这里以C99标准为例,这可能是您正在使用的,也可能不是。不过,它应该适用。在C99标准中,附录J.2列出了未定义的行为。您应该注意:

  • 对象在其生命周期之外被引用(6.2.4)

  • 使用指向生命周期已结束的对象的指针的值(6.2.4)

mah在上面提到了这一点-由于行为是未定义的,你不知道会发生什么。在您的情况下,数据可能被留下了,您现在正在不正确地访问免费数据,而这些数据恰好仍然是准确的。给它时间和更多的malloc,这些数据很可能/最终会从你下面改变出来


编辑:链接到文档以供参考:

空间被释放并返回到堆。数据不会被
free()
修改,因此代码可能会继续工作(至少一段时间)。但是,该内存可供任何后续内存分配使用,当这种情况发生时,要么树数据将被新所有者修改,您的树将被破坏,要么您将修改树,内存的新所有者将被破坏

实际行为始终取决于何时损坏、何时损坏以及如何使用损坏的数据。在最坏的情况下,您可能会破坏整个堆,许多东西将被破坏,很难找到原始原因


例如,如果不使用Valgrind等分析工具,在运行时不会检测到继续使用空闲内存,并且您可能根本不会观察到任何特定的不良行为。这种错误可能在您的代码中存在很长一段时间,但在几个月后一些不相关的代码更改后,却导致失败。

free()坏了吗?还是你的代码?我知道我的钱在哪…@MitchWheat找不到适合这个问题的标题。尝试在你
free
之后访问某个内容是一个bug。带有bug的代码会出现意外行为。(不读取代码,但仅基于您的描述:)free()使该缓冲区可用于重新分配,但不会覆盖缓冲区(基于调试的特定情况除外)。持有陈旧指针的代码可能能够访问旧内存,但该代码的行为方式未定义;它可能会幸运地工作,可能会导致崩溃,可能会中断其他数据和/或操作,可能。。。。你明白了。我没有任何参考资料,因为我没有你认为会存在的行为。。。人们通常不会记录函数没有做什么,但由于没有文档说明函数清除了缓冲区,因此没有充分的理由认为它会这样做。您可以阅读libc源代码以找到一个实现,但首先要考虑:如果您正在编写
free()
,是否需要清除内存的开销?如果开发者想自己调用
memset()。谢谢你的文件。
void *dequeue(struct q *q_instance)
{
    struct q_node *temp;
    void *jsw_node_ptr;

    if (q_instance->beg == NULL)
        return NULL;

    temp = q_instance->beg;
    jsw_node_ptr = temp->node;

    if (q_instance->beg == q_instance->end)
        q_instance->beg = q_instance->end = NULL;
    else
        q_instance->beg = q_instance->beg->next;

    free(temp);

    return jsw_node_ptr;
}

void bfs_order(struct jsw_node *root)
{
    struct q *q_instance = NULL;
    struct jsw_node *temp;
    if (root == NULL)
        return;

    q_instance = init_q();
    enqueue(q_instance, root);

    while (q_instance->beg) {
        temp = /*(struct jsw_node *)*/dequeue(q_instance);
        fprintf(stdout, "%d\t", temp->data);
        if (temp->link[0])
            enqueue(q_instance, temp->link[0]);
        if (temp->link[1])
            enqueue(q_instance, temp->link[1]);
        free(temp); /* Here is my confusion */
    }

    free(q_instance);
}