2012年(158)
分类: C/C++
2012-11-26 09:40:01
网友评论2012-11-26 09:43:00
CornWu
我认同Diviner兄防御性编程的说法。
对于一个持续作业的服务器来说,我宁愿多消耗系统资源来做防御性检测,也不宁愿让服务器偶尔崩溃导致经常重启服务器。
像
第2个恶习,就是重复释放的问题
int* p = new int;
delete p;
p = NULL;
delete p;
这种写法,看似很繁琐,但是对连续运行的系统来说,它是让系统连续运行不报错的写法。如果没有p = NULL;这行代码,那程序执行两次delete肯定报错。
int* p = new int;
delete p;
。。。此处有N多行代码
delete p;
如果代码是这样写,当错误发生时,怎么去查找错误?
网友评论2012-11-26 09:42:50
周星星
第一种,如果你想通过参数(而不是返回值)来判断是否成功,用lpFilename[0]='\0'而不是memset。另外,我反对的是“必先用 memset”,而不是在任何情况下都不许用memset。
第二种,当代码有错误,你想修改其它正确的地方,让某个错误被遮盖。那么这个错误是否可能完全被遮盖,如果不能的话,与其修修补补不停的去掩盖,不如大大方方的把错误去掉;掩盖错误的手段会不会导致原本正确的代码反而运行错误?阿荣说过:做正确的事,而不是把错误的事做正确。
就拿重复释放来说事,一旦出现重复释放的错误,大抵是因为逻辑错误了。代码大部分情况下是拷贝的
delete p1;
delete p1;
调试一遍我就知道第二句写错了应该是 delete p2,而如果
delete p1; p1=0;
delete p1; p1=0;
则完完蛋了。这就是正文中“这两个恶习估计唯一的作用就是隐藏Bug,令错误难于被发觉”的注解。