Chinaunix首页 | 论坛 | 博客
  • 博客访问: 75760
  • 博文数量: 15
  • 博客积分: 607
  • 博客等级: 中士
  • 技术积分: 170
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-20 14:42
文章分类
文章存档

2011年(1)

2008年(14)

我的朋友

分类: C/C++

2008-04-01 18:49:33

有很多常见的错误程序,一一记录下来,这篇文章会不定时更新:
[001]
错误类型:内存泄漏。
错误描述:堆内存没有手动回收。
更改建议:最好可以自己对malloc和free函数进行封装。例如封装一个myMalloc函数,在每次调用此函数时,在malloc内存的同时,使用一个全局数组或相似功能的变量,对每一次内存分配进行记录。同样free时也进行记录,如此,在程序运行时,就可以通过产看这个全局变量的状态来知道目前程序是否内存泄露。(当然,有很多第三方软件例如valgrind专门用来检查内存泄露。但对于自己的程序,我还是建议这样做。)
错误扩展:文件的打开关闭,socket的打开关闭等等。
[code]
void f(void)
{
    char*p1;
    p1=(char*)malloc(10);
    //free(p1);   --就是这里。
}
[/code]
 
[002]
错误类型:野指针。
错误描述:堆内存已经释放,但程序又对其进行了引用,或是变量根本没有初始化。
更改建议:每次释放后,将指针置为空,就是available=NULL,这样下次访问此指针时同样会出错,那为什么还要这样呢?因为,这样的错误就是“空指针”了,“空指针”比“野指针”好的地方就是他每次都会犯错误,而且容易被抓到。这样我们就容易定位了,常常有程序跑很久没问题,或是在一台机器上跑没问题,就是因为野指针有可能隐藏的比较好。
错误扩展:多次free()也是同样道理,这个也很容易犯,似乎比上面的频率更高。
[code]
void f(void)
{
    char*p1;
    p1=(char*)malloc(10);
    free(p1);
    // printf("%s", *p);   --就是这里。
}
[/code]
 
[003]
错误类型:空指针。
错误描述:就是上面提到的空指针,就是指针为空喽。
更改建议:这个问题比较容易查到,gdb一调发现指针值为0X00000000就好了。这个记住所有变量手动初始化。包括全局变量,别怕麻烦,也来吧。
[code]
void f(void)
{
    char*p1 = NULL;
    // printf("%s", *p);   --就是这里。
}
[/code]
 
[004]
错误类型:内存越界访问。
错误描述:例如数组的下标越界等。
更改建议:这个,多加判断语句喽。一般常量下标不会出问题。怕的是变量,a[n] = 'a';程序就死了,所以要多加判断。请注意错误扩展,因为频率高的是在下面错误扩展中的情况。
错误扩展:sprintf(),memset(),read()等等操作内存的函数。这些才是容易出错的情况。
[code]
void f(void)
{
    char a[10] = {0};
    // printf("%c", a[10]);   --就是这里。
}
[/code]
 
 
阅读(1505) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~