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
指向的内存已经被释放
阅读(5343) | 评论(28) | 转发(0) |