让你在游戏编程中令进程崩溃的错误,有哪几个呢!

前言:工作中使用的C++服务器,稍有不甚就会导致进程崩溃。那么游戏就需要停止更新维护,会造成玩家流失。今天来总结一下,之前碰到过的服务器崩溃问题。很庆幸(烧香拜佛),我的代码只造成过内网开发服的崩溃,外网正式服一次崩溃没有,感激,感激,侥幸,侥幸。

一、数组和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;
}

二、空指针

空指针问题估计也能占到百分之40。这个问题不太好举例。因为问题比较分散。

为了避免,通常会在使用指针前,判空。

三、字符串格式化

简单讲就是类似c语言里的sprintf函数,可能出现格式化的时候传了错误的参数。

这个问题经常出现在log系统里面。

四、vector迭代器失效。

通常出现在遍历vector时,循环里面有erase操作。需要特别注意。

扫描二维码关注公众号,回复: 12336606 查看本文章

五、死循环。

这类问题也不好举例。而且最难查,上面的情况,崩溃之后通常会有个堆栈,用gdb看堆栈会有思路。

死循环会使得进程cpu占用百分之99。死循环只能靠svn帮忙了,哪个版本是好的,哪个版本开始出的问题,修改了哪些内容,打断点排查。

猜你喜欢

转载自blog.csdn.net/m0_50662680/article/details/112304991