免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: mmmixx
打印 上一主题 下一主题

脱裤子放屁的代码…… [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-08-09 19:23 |只看该作者
1. 你的逻辑有点问题:
p1 = p2;
...
p2 = NULL;
之后p1惹了祸不是因为
你使用了p2=NULL这一句引起的.

而且使用这一句明显减少了你犯错误的可能(至少减了一半)
如果考虑到你以后(指使用p2=NULL之后)会有N多
p3 = p2;
p4 = p2;
....
pn = p2;
那么p2 = NULL;帮你减少了更多更多无尽的可能的错误


2. 析构函数又怎么样呢?还不是照样有问题

class AAA
{
public:
AAA();
~AAA()
   {
       if(a){
        delete a;
        //a = NULL;
       }
   }
private:
int * a;
};


AAA *a1, *a2;
a1 = new AAA();
a2 = a1;
delete a1;
a1 = NULL;

a2还是可能可以访问a而不报错

原帖由 mmmixx 于 2007-8-9 19:05 发表

问题是,你在析构函数里还 NULL 什么 NULL 啊。而且,如果:
int *p1, *p2 = new int;
p1 = p2;
delete p2;
p2 = NULL;
p1 还照样不是 NULL 呢,用了 p1 怎么办?

[ 本帖最后由 ypxing 于 2007-8-9 19:29 编辑 ]

论坛徽章:
0
12 [报告]
发表于 2007-08-09 19:26 |只看该作者
这就是bete版和发行版的区别:
bete版少用第一种代码(原因是屏蔽了可能的bug),多用assert,发现更多的bug.
发行版中应该强调稳定性,处理异常错误更重要.

论坛徽章:
0
13 [报告]
发表于 2007-08-09 19:31 |只看该作者
原帖由 converse 于 2007-8-9 19:22 发表


比如说会有什么bug呢?


我见到过因为这么做(设成NULL),使得某个流程通常情况下不出问题,
但实际上,这个流程逻辑上是不对的。

问题在后来才发现,花费了大家很多时间重新回来检查,
如果不这样设成NULL,流程的问题立刻就暴露了。

具体细节很难回忆了。。。

论坛徽章:
0
14 [报告]
发表于 2007-08-09 19:33 |只看该作者
我喜欢在检测到错误的条件时,
直接

禁止中断; while(1);

将系统停住,连assert都不放心,呵呵

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
15 [报告]
发表于 2007-08-09 19:39 |只看该作者
原帖由 飞灰橙 于 2007-8-9 19:31 发表

我见到过因为这么做(设成NULL),使得某个流程通常情况下不出问题,
但实际上,这个流程逻辑上是不对的。

问题在后来才发现,花费了大家很多时间重新回来检查,
如果不这样设成NULL,流程的问题立刻就 ...

同意你的说法。
大多数情况下,
if ( ptr != NULL ){
    free( ptr );
}
说明程序员就根本不知道他的程序在做什么。

论坛徽章:
0
16 [报告]
发表于 2007-08-09 19:42 |只看该作者
原帖由 飞灰橙 于 2007-8-9 19:31 发表


我见到过因为这么做(设成NULL),使得某个流程通常情况下不出问题,
但实际上,这个流程逻辑上是不对的。

问题在后来才发现,花费了大家很多时间重新回来检查,
如果不这样设成NULL,流程的问题立刻就 ...


还是没说明白问题在哪儿...

论坛徽章:
0
17 [报告]
发表于 2007-08-09 19:46 |只看该作者
很多时候不设NULL,问题会更多
更可怕的是,还不知道潜在问题的存在

原帖由 飞灰橙 于 2007-8-9 19:31 发表


我见到过因为这么做(设成NULL),使得某个流程通常情况下不出问题,
但实际上,这个流程逻辑上是不对的。

问题在后来才发现,花费了大家很多时间重新回来检查,
如果不这样设成NULL,流程的问题立刻就 ...

论坛徽章:
0
18 [报告]
发表于 2007-08-09 20:04 |只看该作者
仁者见仁吧,这个和coding standard一样,很难说服别人的

论坛徽章:
0
19 [报告]
发表于 2007-08-09 20:06 |只看该作者
原帖由 flw 于 2007-8-9 19:39 发表

同意你的说法。
大多数情况下,
if ( ptr != NULL ){
    free( ptr );
}
说明程序员就根本不知道他的程序在做什么。



这个问题也许是有争议的。正如switch case时候,即便到了最后一个分支,也推荐加上break语句来结束。
好像是gnu的推荐?理由是,人们会尽可能的尊重你的代码,认为它是有价值的。会在很长的时间得到应用。
但是随着时间的流逝是情况的变化,有时候不得不对修改你的代码。也就有可能在switch的最后一个标号加
一个分支。作为一个很简单,但是确在很多时候有效的保护性的措施,这些做法都无可厚非。
实际上,你这段代码以后要作什么样的修改,由谁来修改,要该成什么样子,修改你程序的人是否会有你一样
足够的水平,都很难预料。ptr要进行什么样的运算,程序以后以后变成什么逻辑。都不是可以预料的。

就你这个例子来说,你可以理解换个方式理解,
程序员并不是不知道ptr当前是否需要free(是否会进入到free分支),事实上,作为一个头脑清醒的程序员,
应该能够也需要知道运行到这个代码位置ptr是否应该free,是否可以free。但你可以这么理解,也传递这样
一个信息,“我一定要保证不能内存泄漏,只要ptr不为空,一定要free!”

论坛徽章:
0
20 [报告]
发表于 2007-08-09 20:24 |只看该作者
原帖由 飞灰橙 于 2007-8-9 19:10 发表
第二个assert,LZ自己没搞清吧
试想如果是非debug模式编译呢?

assert 是用来测试程序员犯晕时犯的错误的(测试空指针、错误参数等),不是用来测试运行时错误的。如果 if 语句是用于测试运行时错误,为什么还要用 assert。如果使用于测试程序员犯晕的错误,那就没必要 if。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP