-2
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)

释放内存时出了点问题,我无法弄清楚实际问题。请帮助在上述程序中释放内存的真正问题是什么

4

3 回答 3

6
p = malloc(5 * sizeof(int));
p =(int[5]) {11,12,13,14,15};

你正在覆盖p;你的程序有内存泄漏。

free(p);

p不再指向您分配的对象mallocfree只能使用指向分配的内存对象的指针参数调用malloc

要修复您的程序,请删除以下行:

p =(int[5]) {11,12,13,14,15};

并显式地将值分配给您的数组。

for (int i = 0; i < 5; i++)
{
    p[i] = i + 11;
} 
于 2013-07-30T09:07:23.530 回答
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};  

上次分配后,您无需拨打免费电话pp(当生命结束时,内存被隐式释放)。

之后p = malloc(5 * sizeof(int));,您可以为动态分配的内存分配值,并且指令p[i] = 25;是有效的操作(在调用之前free(p))。

于 2013-07-30T09:07:38.327 回答
2

因此,正如其他人已经指出的那样,p用指向复合文字的指针覆盖free()它并不好。但是,如果您实际上并不需要动态内存分配(如您的情况,因为您仅在函数内使用数组),则删除对 and 的调用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));
于 2013-07-30T09:43:49.120 回答