loop_in_codes

低调做技术__欢迎移步我的独立博客 codemaro.com 微博 kevinlynx

指针和模块健壮

仔细想想能导致一个C++程序崩溃的几乎90%原因都是跟指针有关。空指针野指针,一不小心
程序就崩了。写C++程序的人基本上都知道这个问题。在我们周围避免这些问题的常规方法
也很多,诸如auto_ptr(及其他基于template的原始指针wrapper)、SAFE_DELETE。当然也
会有很多人在实现一个函数时会很勤劳地对每一个parameter进行合法判断。

其实,我们都知道,auto_ptr这些东西始终是无法避免野指针和空指针带来的灾难。
SAFE_DELETE也不能阻止别人使用这个空指针。

在我看过的一些开源项目的代码中,这些代码给人的感觉就是别人总能详细地掌控各种资源
(包括指针及其他变量)的使用情况。相比之下,公司隔壁组的老大则显得保守很多。他要
求我们几乎要对所有指针的使用进行空值判断(野指针也判断不了),当然,各种成员变量
也要进行即使现在看上去没多大用的初始化。

也许,这样做后程序是不会挂掉了。但是,就我们的观点来看,这样反而会隐藏一些BUG。
为什么我们不能详尽地去管理一个指针?一个指针变为空了,总是因为在这之前发生了错误
。当然,野指针本身就是愚蠢代码产生的东西,这里没必要讨论。空指针之所以为空,也是
因为在很多时候我们把空作为失败/错误/无效的标志。

恰好上周我的一些代码就真的在空指针上出现了问题。外网的服务器随时会因为玩家的一些
临界操作行为而崩溃掉。虽然我通过修改脚本来屏蔽这个问题(因为不能说停机维护就停机
维护),但是总感觉程序是不安全的。人不吃点教训绝对不学乖。

后来我对这个问题彻底思考了一下。很多程序员都自认聪明。在写C++程序时,我从来不提
供没用的public接口,尤其是set/get。我也从来不对没必要的成员变量进行初始化。我给
的理由是对于这些东西我都有很清晰的把握,我为什么要做stupid的事情?

但是,我几乎从来没有界定,指针在哪些情况下需要去判断为空?函数的参数绝对不需要。
假如函数的参数就是个空指针,那是client程序员的责任。仅供模块内使用的指针(包含其
他资源)在内部使用时也不需要去判断。如果去判断了,那说明你对你自己写的模块都缺乏
精确的把握,证明你的设计思维不够清晰。

什么时候需要判断?当指针依赖于外部环境时,例如读配置文件、载入资源,因为外部因素
不确定不在自己控制范围内,那么进行判断。同样,当使用了其他模块返回的指针值时,也
需要判断。这个其实和“外部环境”属于同一种情况。因为我们对其他模块也不清楚,更为
隐蔽的是(随着其他模块的改变,将来会在你的模块里爆发崩溃错误),其他模块由别人维
护,其变化更不受自己控制。之前我对这一点界定不是很清楚,这也是我犯错的原因。

现在想想,像游戏服务器这种程序,里面塞着各种各样的游戏功能。无论是哪一个模块出现
个空指针访问出错的问题,都会直接让服务器崩掉。关键是这个结果经常伴随着玩家的损失
。所以理想状态下,把每一个模块都放置在单独的进程里,确实是很有好处的。

posted on 2009-06-28 19:35 Kevin Lynx 阅读(2185) 评论(5)  编辑 收藏 引用 所属分类: 通用编程模块架构

评论

# re: 指针和模块健壮[未登录] 2009-07-04 16:16 expter

其实有时候编程习惯和风格占据很大因素!  回复  更多评论   

# re: 指针和模块健壮 2009-07-09 13:15 xsap

模块内使用的指针有时也可以ASSERT一下, 后续人员对模块进行修改, 万一其对模块把握不够大, 导致的一些错误比较容易暴露.  回复  更多评论   

# re: 指针和模块健壮 2009-07-16 22:24 owlcn

"把每一个模块都放置在单独的进程里",每一个模块的大小如何划分呢。诚如你所说,游戏里有各种各样的功能,哪些功能划分到一个模块,放到一个进程。哪些又应该独立到别的进程呢?
请问这个有什么原则或者说思路么?  回复  更多评论   

# re: 指针和模块健壮[未登录] 2009-08-17 22:28 lin

虽然我通过修改脚本来屏蔽这个问题(因为不能说停机维护就停机
维护)


zm,这个是怎么做的哦  回复  更多评论   

# re: 指针和模块健壮 2009-08-18 11:54 Kevin Lynx

@lin
当时那个BUG是因为C++代码中对某个指针没判断,而由于某些临界条件就会导致这个指针为NULL。恰好可以通过在策划的脚本里做些修改而避免程序里那段代码的执行。这个跟具体的应用环境有关系,别误会。  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理