游戏编程中 令进程崩溃的错误总结

工做中使用的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帮忙了,哪一个版本是好的,哪一个版本开始出的问题,修改了哪些内容,打断点排查。

除了通常的循环里,还会有一种递归没出回溯的死循环。要是用了递归要特别当心回溯条件。

相关文章
相关标签/搜索