正好刚才又遇到一个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) |