C中free()的异常行为
注意:如果问题太长或格式不适合,我深表歉意。如果不在合适的站点上,请建议该问题更适合哪个StackExchange站点。C中free()的异常行为,c,pointers,free,C,Pointers,Free,注意:如果问题太长或格式不适合,我深表歉意。如果不在合适的站点上,请建议该问题更适合哪个StackExchange站点。 我一直在学习有关AVL树的教程,并决定为该树添加BFS搜索。这是我的实现(它的一部分)- 现在,即使我free()函数dequeue()返回的变量也不会对我造成伤害。但是,返回的值已在其他一些函数中动态分配。它怎么不会对我的树造成任何问题?free()不应该释放分配的空间吗?我在这里以C99标准为例,这可能是您正在使用的,也可能不是。不过,它应该适用。在C99标准中,附录J.
我一直在学习有关AVL树的教程,并决定为该树添加BFS搜索。这是我的实现(它的一部分)-
现在,即使我
free()
函数dequeue()
返回的变量也不会对我造成伤害。但是,返回的值已在其他一些函数中动态分配。它怎么不会对我的树造成任何问题?free()
不应该释放分配的空间吗?我在这里以C99标准为例,这可能是您正在使用的,也可能不是。不过,它应该适用。在C99标准中,附录J.2列出了未定义的行为。您应该注意:
- 对象在其生命周期之外被引用(6.2.4)
- 使用指向生命周期已结束的对象的指针的值(6.2.4)
编辑:链接到文档以供参考:空间被释放并返回到堆。数据不会被
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);
}