作为一名C/C++程序员,指针是最容易导致程序出错原因之一,而指针问题引起的后果又常常是down机。指针造成down机通常是由于指针在使用之前没有进行NULL的判断,或是出现野指针了,引用了不可使用的地址。
对于野指针,常常是由于程序员操作复杂的数据结构,或是复杂的逻辑的,对指针进行了错误的赋值。
而空指针,就只是需要简单的进行NULL判断就可以避免引起down机。虽然是简单的判断,可是在项目中,由于种种原因忘记判断的例子举不胜举。一但代码量比较大,赶进度,或是逻辑比较复杂,比如pointer->child->child这种要引用多级的指针时,一个不小心就会忘记判断NULL,而造成down机。特别是出现“理论上”不可能是空指针的指针,程序在长时间地运行中,“理论上”的不可能也有可能变成可能,于是就down机了。所以,“只要是指针就要判断NULL”,这句话是每个C/C++程序绝对要遵守的准则之一。
虽然,总是在强调指针判断NULL,但又总会出现这个问题,周六晚上,我的代码就出现了空指针没有判断的错误,这段代码还是去年十二月份提交的代码,造成了7000多个玩家掉线,当时正要进行一次拉人活动,造成了不小的损失。结果老总大怒,好再老大帮我说了好话,不然就不只是罚一百块钱了。今天检查了下代码,大家提交的代码里多多少少有一些指针没有判断NULL,基本上都是“理论上”不可能为空的指针,但毕竟是“理论上”的。
那么如何让空指针问题远离我们的程序呢?在我看来有以下几点:
第一,要养成对指针判空的好习惯,每次要使用指针之前都进行NULL的判断,特别是pointer->child->child这种多级的指针,最好是分行写成:
这样写出现很清楚,又不容易漏判空,
第二,写代码时要专心,一心一意,可能有些程序员在做比较简单的功能时,感觉时间比较充裕,就一边和朋友聊天,或是一边打游戏一边写程序,这种习惯非常不好,因为想着其它事情写程序时,常常由于经历不集中而造成低级错误,指针没有判空就是这种低级错误的典型代表。
第三,困的时候不要写代码,困的时候眼睛都睁不开,更不要提写代码了。
第四,代码的检查,在代码提交前,一定要检查代码,不能太相信自己,你可以把svn diff的结果定向到一个文件中,在这个文件中认真地查一下指针,特别是带“->”的地方,看看提交的代码中有没有指针没有判空的地方,这点是很有效的,可能你一千行的代码,用这种方法只需要十多分钟就可以检查你的指针有没有判空,多花十几分钟来提高你代码的健壮性,何乐而不为?