很久以前写的,最近来了两个做C++的兄弟,感觉有必要共享一下:
1. 用断言宏来检测程序的逻辑错误。分析一下程序CORE掉的原因,绝大部分是因为空指针或者无效指针引发的,而绝大部空指什和无效指针是因为程序的逻辑错误导至的。
因此,在调试版中用断言宏来检测逻辑错误,是一个很有效的方式。
以下是我程序里面的一段代码://如果坐位不为空
if (pSeat != NULL)
{
//那么这个座位上就一定有人
ASSERT((pSeat->getPlayer() != NULL));
InitPlayerData(pSeat);
if (pSeat->getTeam() == RED_TEAM)
{
++m_redalive;
m_redAvgLevel += pSeat->level;
}
else
{
//房间内的玩家,不是红队,就一定是蓝队的
ANT_WARS_ASSERT(pSeat->getTeam() == BLUE_TEAM);
++m_bluealive;
m_blueAvgLevel += pSeat->level;
}
}
2. 过度的空指针检测,会导至BUG的抗药性。有人说,不就是空指针吗?这还不简单,我一行代码就把他给灭了。
但正如我第一条所说,空指针,有时候只是表像,过度的空指针检测,有可能只是暂时隐藏了BUG,等你发现问题的时候,也许,离真正的BUG越来越远了。
如果你实在不能确实会遇到什么情况,那就把断言宏和空指针检测一起加上吧,在测试的时候,如果出了问题,再认真分析一下程序的逻辑。
对战服务器是我维护的,从去年上线到现在,一共CORE掉过三次,三次都是未检测空指针,第一次,在断言宏里面CORE了,我发现一个逻辑错误,但还是没做空指针检测。第二次,还是在同一个地方CORE,我发现一个非常严重,隐藏得很深的逻辑错误,还是未加空指针检测,但再未出过问题。
第三次,是忘了对客户端的数据做校验, 加上空指针检测就OK了。
坦白地说,这样的,就是非常依懒于你的测试和代码逻辑的严谨,并且,你可能在测试的时候,发现许多之前以前不可能发现的事情:添加了一个错误的断言宏。
//通过plr->GetSeat() 一定会返回一个合法的座位号,同时getSeat()没有任何理由输入一个合法的坐位而返回一个空的或者错误的 SEAT 指针//但大家也看到了,我还是做了空指什处理,这也算是对当时急着上线,测试不允分的一种妥协.
Seat * shooter = getSeat(plr->GetSeat());
ASSERT(shooter != NULL);
if(shooter == NULL || shooter->turn == false)
{
OnUsePropsFailed(plr, nPropsID);
return;
}