Chinaunix首页 | 论坛 | 博客
  • 博客访问: 982511
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

2012年(158)

我的朋友

分类: C/C++

2012-11-26 09:40:01

1。在对字符串赋值前,必先用memset进行全部赋零操作
有人说这么安全。不知道证据从哪儿来的?
有人说多这一句也不多。不知道多哪一句才算多?

2。对于不再使用的指针变量,赋零
有人说这么安全。不知道证据从哪儿来的?
有人说多这一句也不多。不知道多哪一句才算多?

--------- 以下是俺觉得内容太少,而拉过来凑字数的,不是闲得发慌的话,不需要看 ---------

这两个恶习估计唯一的作用就是隐藏Bug,令错误难于被发觉。(这句话转自 chinaunix 上的一位牛人,深表赞同 )

第1个恶习,有个好例子,在论坛上出现过
char str[16];
memset( str, 0, 16 );
str[0] = 'a';
str[1] = 'b';
str[2] = 'c';
printf( "%s", str );
如果没有memset这一句,结果就是错误的,所以他认为数组赋值前先memset一下是个很好的风格。
(正确的做法是str[3] = '\0')

对于 位比较 不在此列,比如将 str[16] 送入加密函数 void foo( void* p, size_t n )
那么 "abc \0 1" 和 "abc \0 2" 就是不等同的,在论坛中也见到过两次,有人问“我用DES3加密一个字符串,每次输入都是abc,但结果却不一样”,呵呵。

第2个恶习,就是重复释放的问题
int* p = new int;
delete p;
p = 0;
delete p;
如果没有p = 0;这一句,结果就是错误的,所以他认为这也是个很好的风格。
(正确的做法是删除重复的delete p。我们的目的是去除错误,而不是让错误不产生危害

对于p = 0 某些人(只是某些人而已)会用来在Debug版本中做释放检查,算是一种debug的手段,但不应该出现在正式的代码中。
而其实,一般的编译器都会在debug版本中做类似的行为,但绝不是 p = 0 这种傻叉叉的做法,而是 *(int*)p = 特值。
例如
p = new char[100];
p1 = p;
delete[] p; *(int*)p = 0xFEEEFEEE;
如果 *(int*)p1 == 0xFEEEFEEE 说明 p1 指向的内存已经被释放
阅读(5276) | 评论(28) | 转发(0) |
给主人留下些什么吧!~~

网友评论2012-11-26 09:41:27

周星星
我说的是“对于不再使用的……”,如果你有可能去使用它,那么赋个特定值自然是有意义的。

"那么0xFEEEFEEE这个值,我就不同意了。它应该不属于某种标准吧" ------ 这只是Debug的手段之一,仅供debug阶段调试。

网友评论2012-11-26 09:41:18

Diviner
都是习惯问题,第一个有些效率问题,但没啥大关系。我也觉得这是好习惯。

网友评论2012-11-26 09:41:10

cyberscorpio
屌了,这两个恶习我都存在啊。

顺便说一句,星星现在文章很少了啊。

网友评论2012-11-26 09:41:00

jzhang
p=0的用处在于这样的代码
if(!p) p = malloc(123)

网友评论2012-11-26 09:40:51

func
难以解决的问题是多个指针引用同一块内存,而其中一个指针被delete。

我觉得同一个指针被重复delete的情况少,同一段内存被重复释放的情况会多些。

delete和free本身就支持释放0指针。这么做大概是为了免得大家再写if(ptr) {free(ptr); ptr=0;}这样的啰嗦的结构。

不靠指针值标记内存已释放,那只能靠一定的代码结构。比如只在构造里new,只在析构时delete。析构完了,基本上没人再动类里的指针,除非疯了。

我倒觉得严格要求new/delete配对,不利于代码的灵活编写。

比如一个指针的数组,一番操作后(离散的申请释放内存),最后一总清理。除非之前的释放做了0标记,没有太好的办法在一个总的释放调用中,把数组释放干净。

如果你同意已释放的标记是必须的,那么0xFEEEFEEE这个值,我就不同意了。它应该不属于某种标准吧,这个值万一是个正常的地址