记录一次奇怪的段错误经历

背景

GTK编程,在函数内部定义了一个结构体,作为指针传递给其他函数,在其他函数内部调用结构体内部成员变量,发现有一个成员变量总是为空,另外一个不会。

 

原因

定义结构体的位置在回调函数内部,回调函数运行完成后,结构体所在内存即被回收。

然而有时候在一定时间内回收内存里的数据没有发生改变,所以有些结构体的成员变量还是能够正常获取。

但是在执行其他指令的时候,原结构体部分成员变量的内存会被重用,造成内部数据改变,再去调用的时候,得到的就是完全随机的数据,如果把它当做指针使用,它指向的内存是未知的,未被申请的,再去操作这段内存就会发生段错误。

 

解决办法:

将结构体定义成 static 类型,让他在程序的整个生命周期内有效,不会被回收。