2011-01-04 3 views
3

にコード与えコール()*** glibcの検出***エラー

*** glibc detected *** ./mallocTest: free(): invalid pointer: 0x000000000040069c *** 
======= Backtrace: ========= 
/lib/libc.so.6(+0x71496)[0x7f92ee448496] 
/lib/libc.so.6(cfree+0x6c)[0x7f92ee44d29c] 
./mallocTest[0x40059e] 
/lib/libc.so.6(__libc_start_main+0xfd)[0x7f92ee3f5c3d] 
./mallocTest[0x4004b9] 
======= Memory map: ======== 
00400000-00401000 r-xp 00000000 08:08 3162120       /home/gabriel/Programming/C/mallocTest 
00600000-00601000 rw-p 00000000 08:08 3162120       /home/gabriel/Programming/C/mallocTest 
01327000-01348000 rw-p 00000000 00:00 0         [heap] 
7f92e8000000-7f92e8021000 rw-p 00000000 00:00 0 
7f92e8021000-7f92ec000000 ---p 00000000 00:00 0 
7f92ee3d7000-7f92ee52a000 r-xp 00000000 08:08 2452227     /lib/libc-2.12.2.so 
7f92ee52a000-7f92ee729000 ---p 00153000 08:08 2452227     /lib/libc-2.12.2.so 
7f92ee729000-7f92ee72d000 r--p 00152000 08:08 2452227     /lib/libc-2.12.2.so 
7f92ee72d000-7f92ee72e000 rw-p 00156000 08:08 2452227     /lib/libc-2.12.2.so 
7f92ee72e000-7f92ee733000 rw-p 00000000 00:00 0 
7f92ee733000-7f92ee748000 r-xp 00000000 08:08 33223      /usr/lib/libgcc_s.so.1 
7f92ee748000-7f92ee948000 ---p 00015000 08:08 33223      /usr/lib/libgcc_s.so.1 
7f92ee948000-7f92ee949000 rw-p 00015000 08:08 33223      /usr/lib/libgcc_s.so.1 
7f92ee949000-7f92ee9ca000 r-xp 00000000 08:08 2449430     /lib/libm-2.12.2.so 
7f92ee9ca000-7f92eebc9000 ---p 00081000 08:08 2449430     /lib/libm-2.12.2.so 
7f92eebc9000-7f92eebca000 r--p 00080000 08:08 2449430     /lib/libm-2.12.2.so 
7f92eebca000-7f92eebcb000 rw-p 00081000 08:08 2449430     /lib/libm-2.12.2.so 
7f92eebcb000-7f92eecb7000 r-xp 00000000 08:08 33213      /usr/lib/libstdc++.so.6.0.14 
7f92eecb7000-7f92eeeb6000 ---p 000ec000 08:08 33213      /usr/lib/libstdc++.so.6.0.14 
7f92eeeb6000-7f92eeebe000 r--p 000eb000 08:08 33213      /usr/lib/libstdc++.so.6.0.14 
7f92eeebe000-7f92eeec0000 rw-p 000f3000 08:08 33213      /usr/lib/libstdc++.so.6.0.14 
7f92eeec0000-7f92eeed5000 rw-p 00000000 00:00 0 
7f92eeed5000-7f92eeef3000 r-xp 00000000 08:08 2449712     /lib/ld-2.12.2.so 
7f92ef0be000-7f92ef0c3000 rw-p 00000000 00:00 0 
7f92ef0f1000-7f92ef0f2000 rw-p 00000000 00:00 0 
7f92ef0f2000-7f92ef0f3000 r--p 0001d000 08:08 2449712     /lib/ld-2.12.2.so           
7f92ef0f3000-7f92ef0f4000 rw-p 0001e000 08:08 2449712     /lib/ld-2.12.2.so           
7f92ef0f4000-7f92ef0f5000 rw-p 00000000 00:00 0                      
7fff6b352000-7fff6b373000 rw-p 00000000 00:00 0       [stack]              
7fff6b3ff000-7fff6b400000 r-xp 00000000 00:00 0       [vdso]              
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0     [vsyscall]             
Aborted 

を私はポインタであることを取っていますそれを解放する前に何とか壊れてしまったのですが、どうしていいか分かりません。それを使って何もしないで、すぐにそれを解放するとうまくいくので、私は文字列の値を間違って入れています。

このような新しくて申し訳ありません。どんな助けでも大歓迎です。

ああ、なぜ標準のC++ライブラリがそのエラーに含まれているのかわかりませんが、それは問題ではありません。手動でgccをコンパイルしようとしましたが、libstdC++を除いた同じエラーが発生しました。コード::ブロックは愚かです。

+0

BTW: "Hello \ 0"という文字列を書く必要はありません。文字列リテラルを書くたびに、最後に自動的に '\ 0'が追加されます。 –

答えて

13
char * cp = malloc(sizeof * cp * 20); 

char*として宣言され、20 charの動的に割り当てられた配列を指すように初期化されます。

cp="Hello\0"; 

今、あなたはcpの前の値を失って、固定文字列を指すようにcpを割り当てます。これがメモリリークの原因です。

free(cp); 

これで固定文字列freeが試されますが、これは不正です。 malloc(またはcallocまたはrealloc)によって割り当てられたメモリはfreeのみです。

2

mallocedポインタを読み込み専用データへのポインタで上書きしました。あなたはstrncpy()を使う必要があります。

また、malloc引数はsizeof(char)* 20でなければなりません。

+2

'sizeof * cp * 20'は、' cp'の型の変更に直面して少なくとももっと頑強です。 'sizeof(char)'を明示的に使用する際のポインタはありません。 –

+0

'sizeof(char)'を書かないでください。 OPが "1"( 'sizeof * cp')と書かれたやり方はやや便利ですが、' sizeof(char) 'は決して役に立たないものです。 @Charles:悪い言葉遣い... –

6

あなたがmalloc関数から来ていないCPへのポインタ、それゆえクラッシュを代入している

cp="Hello\0"; 

言うとき。ここcp

+0

+1 @super_ness:そのためにstrcpy()を使用する – BlackBear

関連する問題