int main()
{
int *p;
p = malloc(5 * sizeof(int));
p =(int[5]) {11,12,13,14,15};
printf("[%d] [%d] [%d] [%d] [%d] \n",p[0],p[1],p[2],p[3],p[4]);
printf("[%lu] [%lu] [%lu] [%lu]\n",sizeof(&p[0]),sizeof(&p[1]),sizeof(&p[2]),sizeof(p));
printf("[%p] [%p] [%p] \n",&p[0],&p[1],p);
free(p);
return 0;
}
在运行exe时我得到以下内容
[11] [12] [13] [14] [15]
[8] [8] [8] [8]
[0x7fff48ee93e0] [0x7fff48ee93e4] [0x7fff48ee93e0]
*** glibc detected *** ./a.out: double free or corruption (out): 0x00007fff48ee93e0 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x7eb96)[0x7fcce0856b96]
./a.out[0x40068a]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7fcce07f976d]
./a.out[0x4004c9]
======= Memory map: ========
00400000-00401000 r-xp 00000000 08:05 408246 /home/user1/Desktop/c/a.out
00600000-00601000 r--p 00000000 08:05 408246 /home/user1/Desktop/c/a.out
00601000-00602000 rw-p 00001000 08:05 408246 /home/user1/Desktop/c/a.out
00e54000-00e75000 rw-p 00000000 00:00 0 [heap]
7fcce05c2000-7fcce05d7000 r-xp 00000000 08:05 1314445 /lib/x86_64-linux-gnu/libgcc_s.so.1
7fcce05d7000-7fcce07d6000 ---p 00015000 08:05 1314445 /lib/x86_64-linux-gnu/libgcc_s.so.1
7fcce07d6000-7fcce07d7000 r--p 00014000 08:05 1314445 /lib/x86_64-linux-gnu/libgcc_s.so.1
7fcce07d7000-7fcce07d8000 rw-p 00015000 08:05 1314445 /lib/x86_64-linux-gnu/libgcc_s.so.1
7fcce07d8000-7fcce098d000 r-xp 00000000 08:05 1326756 /lib/x86_64-linux-gnu/libc-2.15.so
7fcce098d000-7fcce0b8c000 ---p 001b5000 08:05 1326756 /lib/x86_64-linux-gnu/libc-2.15.so
7fcce0b8c000-7fcce0b90000 r--p 001b4000 08:05 1326756 /lib/x86_64-linux-gnu/libc-2.15.so
7fcce0b90000-7fcce0b92000 rw-p 001b8000 08:05 1326756 /lib/x86_64-linux-gnu/libc-2.15.so
7fcce0b92000-7fcce0b97000 rw-p 00000000 00:00 0
7fcce0b97000-7fcce0bb9000 r-xp 00000000 08:05 1326744 /lib/x86_64-linux-gnu/ld-2.15.so
7fcce0d98000-7fcce0d9b000 rw-p 00000000 00:00 0
7fcce0db5000-7fcce0db9000 rw-p 00000000 00:00 0
7fcce0db9000-7fcce0dba000 r--p 00022000 08:05 1326744 /lib/x86_64-linux-gnu/ld-2.15.so
7fcce0dba000-7fcce0dbc000 rw-p 00023000 08:05 1326744 /lib/x86_64-linux-gnu/ld-2.15.so
7fff48eca000-7fff48eeb000 rw-p 00000000 00:00 0 [stack]
7fff48fdb000-7fff48fdd000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Aborted (core dumped)
释放内存有些不对劲,我无法弄清楚实际问题。请帮助解决上述程序中释放内存的真正问题
答案 0 :(得分:6)
p = malloc(5 * sizeof(int));
p =(int[5]) {11,12,13,14,15};
你正在覆盖p
;你的程序有内存泄漏。
free(p);
p
不再指向您使用malloc
分配的对象。只能使用指向free
分配的内存对象的指针参数调用malloc
。
要修复程序,请删除以下行:
p =(int[5]) {11,12,13,14,15};
并明确地为数组赋值。
for (int i = 0; i < 5; i++)
{
p[i] = i + 11;
}
答案 1 :(得分:2)
free(p)
可以在动态分配的内存上调用,以显式释放内存,而在分配后的代码中:
p =(int[5]) {11,12,13,14,15};
p
指向静态分配的内存,因此您无法调用free(p)
,因为它是未定义的行为。
实际上你应该这样做,否则你的代码有内存泄漏:
p = malloc(5 * sizeof(int));
free(p); // free dynamically allocated memory
p =(int[5]) {11,12,13,14,15};
在上次分配后,您无需在p
上免费拨打电话。 (p
生命结束时隐含释放的记忆。
在p = malloc(5 * sizeof(int));
之后,您可以为动态分配的内存分配值,并且指令p[i] = 25;
是有效的操作(在调用free(p)
之前)。
答案 2 :(得分:2)
正如其他人已经指出的那样,用一个指向复合文字的指针来覆盖p
然后free()
它是不好的。但是,如果你真的不需要动态内存分配(在你的情况下,因为你只在函数中使用数组),那么将调用放到malloc()
和free()
并使用复合只有文字:
p = (int [5]){ 11, 12, 13, 14, 15 };
该对象将具有自动存储持续时间。
但是,如果您确实需要该函数之外的对象,则使用动态分配,并将文字复制到已分配的空间中:
p = malloc(5 * sizeof(*p));
memcpy(p, (int [5]){ 11, 12, 13, 14, 15 }, 5 * sizeof(*p));