glib 中 g_slist 的free问题

问题描述

今天在运行一个代码的时候,在程序退出过程中报了一个错误。freebsd 10.1 中报bus error, signal 10. 搜了一下说是一个诡异的错误。很少出现在程序运行中。自己也觉得不可能触发这样的错误。

debug了一下,发现是g_slist_free_full的时候出现的错误。

问题排查

g_slist_free_full 会对列表中的每个元素都调用其提供的函数来释放元素申请的空间。看来是释放空间的问题了。

排查列表构建过程的时候发现。列表中的元素是使用g_new0(struct node, 10),一次性申请的空间。也就是说一次性的申请了列表中所有元素的空间。然后将这些元素逐个添加到了列表中。

问题就出现了,因为空间是通过g_new0一次性申请的。所以在对第一个元素调用g_free的时候,其实就已经将所有的元素空间都释放了。

所以在对第二个元素再次调用g_free的时候,就出现了错误。但是这个问题为什么会促发bus error。就不知道为啥了。

问题解决

在链表构建的时候,一次只申请一个元素,并且添加到列表中,释放的时候还是使用g_slist_free_full来释放。问题解决。程序顺利结束。

联系我:

Email: xudongsecret@qq.com

===完===