游戏编程中 令进程崩溃的错误总结
工作中使用的C++服务器,稍有不甚就会导致进程崩溃。那么游戏就需要停止更新维护,会造成玩家流失。
今天来总结一下,之前碰到过的服务器崩溃问题。很庆幸(烧香拜佛),我的代码只造成过内网开发服的崩溃,外网正式服一次崩溃没有,感激,感激,侥幸,侥幸。
1.数组和vector下标越界。
如果有人对每一次崩溃做总结,我想这个问题能占百分之40。
随便举个例子,等级礼包。
如果我们的数据结构是:
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; }
因为没有判断边界。外面的东西我们控制不了,只能要求自己的代码部分稳妥。所以我们要加上下标范围判断:
void UpdateRoleLevelReward(int index) { if (index < 0 || index >= MAX_ROLE_LEVEL_REWARD_NUM) return; m_role_level_reward_state[index] = 1; }
如果外围需要我们返回状态,那么可以写成返回bool的函数:
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帮忙了,哪个版本是好的,哪个版本开始出的问题,修改了哪些内容,打断点排查。
除了一般的循环里,还会有一种递归没出回溯的死循环。要是用了递归要特别小心回溯条件。