2013-07-30 54 views
-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) 

有些事情錯在釋放內存,我想不通實際problem.Please的幫助是什麼在上面的程序

+1

這是未定義behaviour.Trying釋放什麼不是由malloc分配的。 –

+0

使用'valgrind'並用'gcc -Wall -g'編譯 –

回答

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; 
} 
+0

甚至更​​好:刪除'malloc()'和'free()',並保留'p =(int [5]){11,12,13 ,14,15};'部分。 – 2013-07-30 09:36:28

+0

@ H2CO3更好,這取決於。我假設他正在使用複合文字只爲他的動態分配的數組對象(這顯然是不正確的)分配值。 – ouah

+0

我的觀察完全是基於他從不從函數返回它的事實,因此,動態內存分配是多餘的。 – 2013-07-30 10:30:20

2

free(p)可以叫上動態分配的內存明確解除分配內存,而在轉讓後您的代碼:

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

p指向一個靜態分配的內存,所以你不能叫free(p)因爲它是未定義的行爲。

其實你應該做的一樣,否則你的代碼有內存泄漏:去年分配你不需要致電上p

p = malloc(5 * sizeof(int)); 
free(p); // free dynamically allocated memory 
p =(int[5]) {11,12,13,14,15}; 

。 (對於這個內存,當p生命結束時隱式釋放)。

p = malloc(5 * sizeof(int));之後,您可以將值分配給動態分配的內存,並且指令p[i] = 25;是有效操作(在調用free(p)之前)。

+0

複合文字不是隻讀的,'p = malloc();免費(p);'只是一個非常低效的無操作。 – 2013-07-30 09:37:01

+0

@ H2CO3你的意思是'p =(int [5]){11,12,13,14,15};'然後'p [2] = 12'不是非法的? –

+0

是的,我的意思是。 – 2013-07-30 09:38:27

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)); 
+1

WaW !! ..有趣的'memcpy(p,(int [5]){11,12,13,14,15},5 * sizeof(* p));''實際上很棒 –