- 论坛徽章:
- 0
|
原帖由 OwnWaterloo 于 2009-12-4 23:09 发表 ![]()
free(NULL); 本来就是安全的。
if (ptr) free(ptr);
if (ptr) delete ptr;
都是脱了裤子放屁
不能这么说吧,主要是为了安全起见。
#include <malloc.h>
#include <string.h>
int main(int argc,char *argv[])
{
char *p=(char *)malloc(10);
memset(p, 0x03, 10);
printf("bef free 1 p:%p\n", p);
free(p);
printf("aft free 1 p:%p\n", p);
printf("bef free 2\n");
free(p);
printf("aft free 2\n");
return 0;
} |
上面代码的输入如下:
[root@myvirfc11 programs]# cc freetest.c
[root@myvirfc11 programs]# ./a.out
bef free 1 p:0x8796008
aft free 1 p:0x8796008
bef free 2
*** glibc detected *** ./a.out: double free or corruption (fasttop): 0x08796008 ***
======= Backtrace: =========
/lib/libc.so.6[0x180231]
./a.out[0x8048507]
/lib/libc.so.6(__libc_start_main+0xe6)[0x126a66]
./a.out[0x80483f1]
======= Memory map: ========
00110000-0027b000 r-xp 00000000 fd:00 204154 /lib/libc-2.10.1.so
0027b000-0027c000 ---p 0016b000 fd:00 204154 /lib/libc-2.10.1.so
0027c000-0027e000 r--p 0016b000 fd:00 204154 /lib/libc-2.10.1.so
0027e000-0027f000 rw-p 0016d000 fd:00 204154 /lib/libc-2.10.1.so
0027f000-00282000 rw-p 0027f000 00:00 0
007f3000-00813000 r-xp 00000000 fd:00 204153 /lib/ld-2.10.1.so
00813000-00814000 r--p 0001f000 fd:00 204153 /lib/ld-2.10.1.so
00814000-00815000 rw-p 00020000 fd:00 204153 /lib/ld-2.10.1.so
0084a000-0084b000 r-xp 0084a000 00:00 0 [vdso]
033c6000-033f0000 r-xp 00000000 fd:00 81401 /lib/libgcc_s-4.4.0-20090506.so.1
033f0000-033f1000 rw-p 00029000 fd:00 81401 /lib/libgcc_s-4.4.0-20090506.so.1
08048000-08049000 r-xp 00000000 fd:00 501482 /home/weiry/programs/a.out
08049000-0804a000 rw-p 00000000 fd:00 501482 /home/weiry/programs/a.out
08796000-087b7000 rw-p 08796000 00:00 0 [heap]
b7ff2000-b7ff4000 rw-p b7ff2000 00:00 0
b8008000-b8009000 rw-p b8008000 00:00 0
bfbf3000-bfc08000 rw-p bffeb000 00:00 0 [stack]
Aborted
可见,free完再次free的话,会出错,比较安全的做法便是:
if (p)
{
free(p);
p = NULL;
} |
|
|