Chinaunix首页 | 论坛 | 博客
  • 博客访问: 375655
  • 博文数量: 44
  • 博客积分: 2060
  • 博客等级: 上尉
  • 技术积分: 528
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-17 20:50
文章分类
文章存档

2011年(1)

2010年(28)

2008年(15)

分类:

2010-03-08 16:04:59

正好刚才又遇到一个free ()的错误,趁热打铁把平时积累的几个经验share一下。

1.  Linux中 free()一个空指针是安全的
例如:
free (NULL);
参见man page
       free() frees the memory space pointed to by ptr, which must have been returned by a previous call to malloc(), calloc() or realloc().  Otherwise, or if free(ptr) has already been called before, undefined behavior occurs.  If ptr is NULL, no operation is performed.

2.“./free: double free or corruption (fasttop)”表示对同一块内存free()了两次
这个很常见,如:
char* p = malloc (1);
free (p);
free (p);

glibc报错类似:
*** glibc detected *** ./free: double free or corruption (fasttop): 0x090f1008 ***

3.“invalid next size (fast)”是堆溢出了
例如:
char* p = malloc (1);
char buf[100];
memcpy (p, buf, sizeof(buf));
free (p);

glibc报错类似:
*** glibc detected *** ./free: free(): invalid next size (fast): 0x08c29008 ***

4.“ invalid pointer:”是对非malloc分配的内存使用了free()或移动了malloc返回的指针
例如:
char buf[100];
free (buf);

又例如:
char* p = malloc (10);
p += 5;
free (p);
这个例子在分配一块内存做数组或链表的情况中很常见。

glibc报错类似:
*** glibc detected *** ./free: free(): invalid pointer: 0xbff41e18 ***

6. 这些错误都可以用GDB调试
产生这些错误后glibc会打印出Backtrace,在调用了其它库的情况下,由于符号不全,对调试帮助不大。在产生错误后glibc会abort()程序,引发一个SIGABRT信号,这样就可以通过GDB捕获查看backtrace信息了。

暂时就想起这些了
阅读(4623) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

安何2010-05-09 19:41:35