工做中使用的C++服务器,稍有不甚就会致使进程崩溃。那么游戏就须要中止更新维护,会形成玩家流失。数组
今天来总结一下,以前碰到过的服务器崩溃问题。很庆幸(烧香拜佛),个人代码只形成过内网开发服的崩溃,外网正式服一次崩溃没有,感激,感激,侥幸,侥幸。服务器
1.数组和vector下标越界。数据结构
若是有人对每一次崩溃作总结,我想这个问题能占百分之40。svn
随便举个例子,等级礼包。函数
若是咱们的数据结构是:spa
const int MAX_ROLE_LEVEL_REWARD_NUM = 3; int m_role_level_reward_state[MAX_ROLE_LEVEL_REWARD_NUM];
m_role_level_reward_state这个变量的上限是3,假设咱们某一次引用用了大于3的下标,那么就越界了。如下这种写法,认为是危险的。指针
void UpdateRoleLevelReward(int index) { m_role_level_reward_state[index] = 1; }
由于没有判断边界。外面的东西咱们控制不了,只能要求本身的代码部分稳妥。因此咱们要加上下标范围判断:code
void UpdateRoleLevelReward(int index) { if (index < 0 || index >= MAX_ROLE_LEVEL_REWARD_NUM) return; m_role_level_reward_state[index] = 1; }
若是外围须要咱们返回状态,那么能够写成返回bool的函数:blog
bool UpdateRoleLevelReward(int index) { if (index < 0 || index >= MAX_ROLE_LEVEL_REWARD_NUM) return false; m_role_level_reward_state[index] = 1; return ture; }
2.空指针。递归
空指针问题估计也能占到百分之40。这个问题不太好举例。由于问题比较分散。
为了不,一般会在使用指针前,判空。
3.字符串格式化
简单讲就是相似c语言里的sprintf函数,可能出现格式化的时候传了错误的参数。
这个问题常常出如今log系统里面。
4.vector迭代器失效。
一般出如今遍历vector时,循环里面有erase操做。须要特别注意。
5.死循环。
这类问题也很差举例。并且最难查,上面的状况,崩溃以后一般会有个堆栈,用gdb看堆栈会有思路。
死循环会使得进程cpu占用百分之99。死循环只能靠svn帮忙了,哪一个版本是好的,哪一个版本开始出的问题,修改了哪些内容,打断点排查。
除了通常的循环里,还会有一种递归没出回溯的死循环。要是用了递归要特别当心回溯条件。