根据异常退出调用栈中的fault_address猜测异常原因:
1、fault_address=0x0 空指针
2、fault_address=较小的地址:野指针(空指针加偏移地址取数据)
3、fault_address=较大的地址:野指针
三个例子:
1、A类对象A_C
将其成员函数A_x
注册给B类对象B_C
,类对象B_C
调用函数A_x
导致异常退出
原因: 类对象A_C
析构后未解注册其成员函数A_x
到类对象B_C
,来将函数A_x
指针置空。类对象B_C
调用函数A_x
时指针为野指针导致异常。
经验:
- 类对象析构时释放周边资源及让周边释放持有的自身资源;
- 析构时指针置空。
2、两个线程同时调同一个类对象A_C
,一个线程X析构A_C
,一个线程Y用A_C
中指针成员变量m
导致异常退出
原因: 线程X析构对象A_C
后置指针成员变量m为nullptr
,线程Y用指针成员变量m
未判空导致异常退出。
经验:
- 使用指针必须判空。
3、类对象A_C
通过接口返回结构体对象m
指针,读取对象m
中成员数据导致退出
原因: 正常情况返回的对象m的指针不为空,当前场景为空,取成员数据为野指针导致异常退出。
经验:
- 周边领域返回的数据不可信,必须指针判空。