现在的位置: 首页 > 综合 > 正文

20111201小结 万恶的free()之后不赋予NULL值

2012年11月07日 ⁄ 综合 ⁄ 共 888字 ⁄ 字号 评论关闭

别忘了给最后一个结点free和null时,也给头结点free和null

============================================================================================

一、当日工作(或学习)内容及进展情况(以条目式陈述,必要时配图说明)

咱先来看一个简单的例子以及结果,但这也是程序今早又出现segmentation fault的根本原因

结果

可以看出对于temp,在free()之后,temp所存储的地址并不是0(null),还是之前的空间地址154128392。所改变的只是它之前所指向的内容被释放掉了,比如temp->next现在所存储的地址为0,但是temp->b估计还预保留一会儿。

下面来看temp在free()后又temp = NULL;的情况,明显出现temp->next为segmentation fault的情况。

总之,一句话:free()后务必要将指针赋NULL;

 

这个错误在我的程序中是这么体现的。先来看一下我在id内存分配时的一段判定代码

第一个判断是第一个结点进来的情况,第二个是后来的结点在链首插入的情况。

我前天之所以在离线分析下,没有出现今天这个错误的原因在于,离线分析我是从pcap文件中先一个包一个包读,然后有不同id和flow再一块一块分配好空间。最后一块一块慢慢释放。在离线分析下,也就是说分配和释放并不是同时进行的。

而现在动态分配是同时进行,因为我都是在链首插入新来的结点,所以头结点应该是最后释放。现在会出现这么一种情况,60秒内来的包都是属于已经存在的id和flow的,那么60秒后,所有结点都释放了,我给的判定是现在这种状况应该为head_id == NULL; 而事实是之前我释放时只是free(),没有赋予null值,导致head != NULL, 因此跳到第二个判断,在head_id->back = now_id_node;中出现错误。出现错误的原因同上面例子的错误

 

二、存在问题及分析(以条目式陈述,必要时配图说明)

 

三、明日工作计划(以条目式陈述)

 

 

 

 

    

抱歉!评论已关闭.