关于网友提出的“ 这样free可以吗?”问题疑问,本网通过在网上对“ 这样free可以吗?”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 这样free可以吗?
描述:
while(current != NULL)
{
free(current);
current = current->next;
}
C Primer Plus 上面的一段代码,编译链接运行都没有报错,可是我却很怀疑这段代码的正确性。
既然已经free(current)了,为什么下面还可以使用current->next?
如果说free只是告诉系统这块内存可以使用了,而并没有立即使用,那么它是怎么告诉的,请熟悉底层
细节的详细解说一下。
解决方案1: 书中弄错了。。我看的时候也碰到,你改成
while(current != NULL)
{
temp = current->next;
free(current);
current = temp;
}
解决方案2: free不会去把指针指向的内容作任何修改,他只会在内存中把一些标记改了,使得这个内存能被malloc重新分配,在下一次malloc之前,这段代码就没问题。在单线程程序中,由于malloc不可能在跳出此函数之前被调用,因此代码总是安全的。但是在多线程程序中,则不能保证。
“一般不会出问题”依赖编译器的内存管理模块的实现,一些特定模块可能修改内容,那么你这个代码就会出错了
2, 8 , 11楼虽然在尝试修正问题,但是显然不明白把current赋值给tmp不会对此问题有任何改善,保存current->next而不是current才是正确的
解决方案3: 不可以,current被free以后,再用current = current->next; 可能有问题
可以先用中间值保存current->next; 然后再赋给current
以上介绍了“ 这样free可以吗?”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2760561.html