免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
51 [报告]
发表于 2007-08-09 22:01 |只看该作者
原帖由 蚊见蚊爱 于 2007-8-9 21:56 发表
楼主,你还嫩了点,
第一个问题, 很多时候 变量的状态不是那么容易维护的
第二个问题, assert不是函数

代码不是那么容易的,不要以为看了几本书,就能指点江山了。

1. 看看这里
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.

2. 对,是个宏,我知道
原帖由 antigloss 于 2007-8-9 20:24 发表

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

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

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

下面这个原文的排版效果好点:

http://www.jetcafe.org/~jim/c-style.html


多谢多谢,很久以前看的东西,记不准了。上次磁盘出了问题。这些东西也都丢了。
这个链接收下了:)

论坛徽章:
0
53 [报告]
发表于 2007-08-09 22:07 |只看该作者
>>例如,a1析构以后,假若有 a3 = new A;,并且刚好分配到 a1 原来指向的空间,而且将 a 的值从 NULL 改成了非 NULL,那么

>>*(a2->a) = 2;

>>还是没错!

考虑这样一种情况:
如果在你执行a3 = new A;之前执行*(a2->a) = 3;的话

那么,设了NULL,你在a3 = new A;之前,你就找到了错误

如果没有设NULL,a3 = new A;之后你可能仍然没有发现错误.

明白了吧?
我是说,它可以帮你更早的发现这个问题

论坛徽章:
0
54 [报告]
发表于 2007-08-09 22:07 |只看该作者
if ( xx )
    {
        delete xx;
        xx = NULL:
    }


好处。

如果xx 是一个指针的引用。  这么做是安全的,而且告诉了外部 我已经删除了这个指针所指的内存。 不讲xx 设置为NULL, 外部的程序仍然可能使用这指针

假设代码如

class b {
char * &a ;
}

char *p = new char[100];

我在b 析够的时候,可以删除也可以不删除p 所指的内存。

外部的代码可以根据p的值,来决定需要重新new 还是不new

论坛徽章:
0
55 [报告]
发表于 2007-08-09 22:13 |只看该作者
你要知道,好的程序员固然需要遵循规范,但是有的优秀的程序员是没有时间仔细推敲规范的,那么,在这个情况下,这个程序员该怎么写代码?

毫无疑问,他要写出首先遵循自己逻辑的代码, 规范细节那么多,如果逐字推敲,你现在还不会编程

论坛徽章:
0
56 [报告]
发表于 2007-08-09 22:13 |只看该作者
free(ptr);
ptr = NULL;

这种代码,用 C 来写还是比较常见的。 但是在 C++ 挺别扭

论坛徽章:
0
57 [报告]
发表于 2007-08-09 22:21 |只看该作者
真是太奇怪了,对付这么个问题,
为什么不用智能指针?很好的自动脱裤机耶!

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
58 [报告]
发表于 2007-08-09 22:21 |只看该作者
haha

论坛徽章:
0
59 [报告]
发表于 2007-08-09 22:26 |只看该作者
明白了吧?我是说,你不能排除我所说的情况的存在吧!别以为设置为 null 就可万事大吉,放松警惕!这反而会造成更多的 bug。

原帖由 ypxing 于 2007-8-9 22:07 发表
>>例如,a1析构以后,假若有 a3 = new A;,并且刚好分配到 a1 原来指向的空间,而且将 a 的值从 NULL 改成了非 NULL,那么

>>*(a2->a) = 2;

>>还是没错!

考虑这样一种情况:
如果在你执行a3 = new A;之前执行*(a2->a) = 3;的话

那么,设了NULL,你在a3 = new A;之前,你就找到了错误

如果没有设NULL,a3 = new A;之后你可能仍然没有发现错误.

明白了吧?
我是说,它可以帮你更早的发现这个问题

论坛徽章:
0
60 [报告]
发表于 2007-08-09 22:27 |只看该作者
楼主没有写过并发多线程应用。

鉴定完毕。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP