无法释放显示内存崩溃的内存

时间:2013-07-30 09:05:55

标签: c linux embedded linux-device-driver

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)

释放内存有些不对劲,我无法弄清楚实际问题。请帮助解决上述程序中释放内存的真正问题

3 个答案:

答案 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));