免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
31 [报告]
发表于 2007-08-09 21:19 |只看该作者
代码的确很好, lz 水平不够而已。

第一个是多一次保重。

第二个是debug 和release区别


不要以为自己强,别人做了那么久不是白做。

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

楼主的 ID 和我的很像


论坛徽章:
0
33 [报告]
发表于 2007-08-09 21:20 |只看该作者
原帖由 benjiam 于 2007-8-9 21:19 发表
代码的确很好, lz 水平不够而已。

第一个是多一次保重。

第二个是debug 和release区别


不要以为自己强,别人做了那么久不是白做。

敢问好在哪里?

论坛徽章:
0
34 [报告]
发表于 2007-08-09 21:21 |只看该作者
你的粉丝,呵呵
还有几个呢

原帖由 MMMIX 于 2007-8-9 21:17 发表

楼主的 ID 和我的很像

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

楼主的 ID 和我的很像

人家最最最最最最最最崇拜mmmix大哥哥了~~~

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

请问错在哪?

见23楼

论坛徽章:
0
37 [报告]
发表于 2007-08-09 21:26 |只看该作者
From C99 7.20.3.2 The free function
The free function causes the space pointed to by ptr to be deallocated, that is, made available for further allocation. If ptr is a null pointer, no action occurs.

From C++98 5.3.5 Delete
if the value of the operand of delete is the null pointer the operation has no effect.


如上

而且,如果 new 失败了,默认是抛出异常的。

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

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
38 [报告]
发表于 2007-08-09 21:31 |只看该作者
原帖由 ivhb 于 2007-8-9 20:06 发表
这个问题也许是有争议的。正如switch case时候,即便到了最后一个分支,也推荐加上break语句来结束。
好像是gnu的推荐?理由是,人们会尽可能的尊重你的代码,认为它是有价值的。会在很长的时间得到应用。
但是随着时间的流逝是情况的变化,有时候不得不对修改你的代码。也就有可能在switch的最后一个标号加
一个分支。作为一个很简单,但是确在很多时候有效的保护性的措施,这些做法都无可厚非。
实际上,你这段代码以后要作什么样的修改,由谁来修改,要该成什么样子,修改你程序的人是否会有你一样
足够的水平,都很难预料。ptr要进行什么样的运算,程序以后以后变成什么逻辑。都不是可以预料的。

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

从英文翻译的?建议给出原文,否则看着忒费劲了。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
39 [报告]
发表于 2007-08-09 21:37 |只看该作者
  1. 下面举个程序异常简单且很不乱的例子, 说明判断是否为空的重要性:

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

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

这是明显的代码结构的问题了。
为什么不把

  1.     char* ptr=new char[102400000];
  2.     if (ptr==NULL)
  3.     {
  4.        ......//....在这里进行系统内存不足时的应急处理
  5.    }
  6.      else
  7.      {
  8.      ...... //这里使用内存做自已的事情
  9.     }
复制代码

写成
  1.     char* ptr=new char[102400000];
  2.     if (ptr==NULL)
  3.     {
  4.        ......//....在这里进行系统内存不足时的应急处理
  5.        return failed;
  6.    }
  7.      ...... //这里使用内存做自已的事情
复制代码

这样子?
if ( ptr != NULL ){
    free( ptr );
}
只有一种情况下有用,那就是和 goto 配合使用时!
而 goto 恰恰是不推荐大量使用的。
少量情况下 break 也会有类似的情形,
因此我前面才加了“大多数情况下”这样的限定语。

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

每次申请内存后, 都要检查是否成功才能使用, 检查方法就是判断指针是否为空.

在 C 里,的确如此,在 C++ 里就不然了。

其次, 在C/C++里, 如果释放一个空指标, 程序是会CORE DUMP的, 因此每次释放内存之前, 都要判断一下是否为空.
From C99 7.20.3.2 The free function
The free function causes the space pointed to by ptr to be deallocated, that is, made available for further allocation. If ptr is a null pointer, no action occurs.

From C++98 5.3.5 Delete
if the value of the operand of delete is the null pointer the operation has no effect.

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

舍本求末的做法,干嘛为了掩盖一个错误而引进更多的(潜在)错误呢!按照这种说法,它分分钟可能将合法的指针值变成非法的指针值,也可能将 NULL 指针值变成非 NULL。这又当怎么讲?

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

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

还没学懂 C++ 吧,new 失败默认是抛出异常的!

[ 本帖最后由 mmmixx 于 2007-8-9 21:54 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP