免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
21 [报告]
发表于 2007-08-09 20:39 |只看该作者
原帖由 ypxing 于 2007-8-9 19:23 发表
1. 你的逻辑有点问题:
p1 = p2;
...
p2 = NULL;
之后p1惹了祸不是因为
你使用了p2=NULL这一句引起的.
而且使用这一句明显减少了你犯错误的可能(至少减了一半)
如果考虑到你以后(指使用p2=NULL之后)会有N多
p3 = p2;
p4 = p2;
....
pn = p2;
那么p2 = NULL;帮你减少了更多更多无尽的可能的错误

我举这个例子是想说明,如果你需要判断指针是否为空才敢释放内存,这说明你程序已经写得太乱了,你可能根本也忘了是否有多个指针指向同一空间,然后导致重复释放内存!

原帖由 flw 于 2007-8-9 19:39 发表

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

同意!

原帖由 ypxing 于 2007-8-9 19:23 发表
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而不报错

你这个例子和我举的那个不是一样么?都是指针指向同一空间。现在的问题不是 a 有没有设置成 NULL,而是 a2 没有被设置成 NULL。要知道,通过 a2 访问已被释放的空间根本就是个错误!

原帖由 antigloss 于 2007-8-9 20:24 发表

assert 是用来测试程序员犯晕时犯的错误的(测试空指针、错误参数等),不是用来测试运行时错误的。如果 if 语句是用于测试运行时错误,为什么还要用 assert。如果使用于测试程序员犯晕的错误,那就没必要 if。

同意!

论坛徽章:
0
22 [报告]
发表于 2007-08-09 20:55 |只看该作者
所以说,你不明白吗
我的例子跟你的根本不一样

如果在析构函数里将a释放掉并置NULL的话

a2一使用a访问内存就会出错,从而使潜在的错误暴露出来

相反的话,你不将a置NULL,问题很有可能不会暴露,使你误认为程序是正确的

原帖由 mmmixx 于 2007-8-9 20:39 发表

我举这个例子是想说明,如果你需要判断指针是否为空才敢释放内存,这说明你程序已经写得太乱了,你可能根本也忘了是否有多个指针指向同一空间,然后导致重复释放内存!


同意!


你这个例子和我举的那 ...

论坛徽章:
0
23 [报告]
发表于 2007-08-09 21:05 |只看该作者
先把明显的屁去掉

  1. char* c = NULL;
  2. free( c );  // ok, posix要求free的对象若是NULL,那么不做任何动作.
复制代码

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

我举这个例子是想说明,如果你需要判断指针是否为空才敢释放内存,这说明你程序已经写得太乱了,你可能根本也忘了是否有多个指针指向同一空间,然后导致重复释放内存!


同意!


你这个例子和我举的那 ...


"判断指针是否为空才敢释放内存,这说明你程序已经写得太乱了"?

有这种说法的人, 是因为写大规模应用程序和关键应用的机会太少了, 不知道别人的原意是什么, 为什么必须这样做.

首先, 在C/C++里, malloc或者new操作符, 并不一定能够真正返回你需要的内存, 尤其是大量并发线程的应用程序中更是如此. 在很多操作系统中, 包括AIX, 在常规内存模式下,内存只能使用到160M左右, 如果不用大内存模式编译,在并发量大时,内存很容易用完. 因此任何写关键应用的程序员, 都要有这个观念: 每次申请内存后, 都要检查是否成功才能使用, 检查方法就是判断指针是否为空.

其次, 在C/C++里, 如果释放一个空指标, 程序是会CORE DUMP的, 因此每次释放内存之前, 都要判断一下是否为空.

最后, 即使不存在内存申请不成功的情况, 但由于其它代码内存越界将自已定义的指针清空的情况也是有的, 为保证应用程序的强壮性和容错能力, 释放前判断是否为空也是必要的. 当然, 这种处理方式会带来的代价是有可能纵容了内存泄漏,但两害相比取其轻,对提供程序稳定性还是有意义的.

下面举个程序异常简单且很不乱的例子, 说明判断是否为空的重要性:

int func1()
{
    char* ptr=new char[102400000];
    if (ptr==NULL)
    {
       ......//....在这里进行系统内存不足时的应急处理
   }
     else
     {
     ...... //这里使用内存做自已的事情
    }

      if (ptr==NULL) delete[] ptr;  //如果不判断指针且内存未申请成功, 或者别人的代码在前面的处理过程中,因内存越界等原因针ptr清空了,此处的释放会造成程序core dump
}

[ 本帖最后由 zszyj 于 2007-8-9 21:10 编辑 ]

论坛徽章:
0
25 [报告]
发表于 2007-08-09 21:08 |只看该作者
原帖由 ypxing 于 2007-8-9 20:55 发表
所以说,你不明白吗
我的例子跟你的根本不一样

如果在析构函数里将a释放掉并置NULL的话

a2一使用a访问内存就会出错,从而使潜在的错误暴露出来

相反的话,你不将a置NULL,问题很有可能不会暴露,使你误认为 ...

倒是有点这个功能。
不过释放内存后,使用 a2 就已经是未定义行为了,对于未定义行为,出现什么情况都不奇怪。你不能担保它就会出错。比如,该段内存在你使用 a2 的之前,a 是否已经被别的代码修改成别的非 NULL值!

论坛徽章:
0
26 [报告]
发表于 2007-08-09 21:10 |只看该作者
原帖由 zszyj 于 2007-8-9 21:05 发表

其次, 在C/C++里, 如果释放一个空指标, 程序是会CORE DUMP的, 因此每次释放内存之前, 都要判断一下是否为空...

回答错误, 扣十分 :wink:

论坛徽章:
0
27 [报告]
发表于 2007-08-09 21:13 |只看该作者
你又理解错了

不是不让它出错

而是让它一非法访问就自己暴露出来,让它立马出错

原帖由 mmmixx 于 2007-8-9 21:08 发表

倒是有点这个功能。
不过释放内存后,使用 a2 就已经是未定义行为了,对于未定义行为,出现什么情况都不奇怪。你不能担保它就会出错。比如,该段内存在你使用 a2 的之前,a 是否已经被别的代码修改成别的非  ...

论坛徽章:
0
28 [报告]
发表于 2007-08-09 21:16 |只看该作者
原帖由 ypxing 于 2007-8-9 21:13 发表
你又理解错了

不是不让它出错

而是让它一非法访问就自己暴露出来,让它立马出错


你理解错了我的意思,我明白你想让它出错并显露出来。但是,此时,解引用 a2 已属未定义行为,它可显露,也可以不显露,因为是未定义行为,所以它想怎么样都行。
以目前的实现来讲,当你使用 a2 时,如果原先被释放的内存已被重新利用,并且 a 所在的内存被重新赋值为别的非NULL值,此时,就不会死出来!

[ 本帖最后由 mmmixx 于 2007-8-9 21:44 编辑 ]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
29 [报告]
发表于 2007-08-09 21:17 |只看该作者
原帖由 mik 于 2007-8-9 18:37 发表
这个MJ挺熟

楼主的 ID 和我的很像

论坛徽章:
0
30 [报告]
发表于 2007-08-09 21:17 |只看该作者
原帖由 isnowran 于 2007-8-9 21:10 发表

回答错误, 扣十分 :wink:

请问错在哪?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP