C++程序异常退出问题总结
根据异常退出调用栈中的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的指针不为空,当前场景为空,取成员数据为野指针导致异常退出。 经验:
- 周边领域返回的数据不可信,必须指针判空。