-3

私のプログラムは完了し、0を返す直前に最後の「DONE2」を印刷しています。主に。私はmallocで動的メモリ割り当てを行っていますが、プログラムに空きがありません。

なぜ/どうすれば無料でこれを取得できますか、プログラムが完了するまで実行されているのはなぜですか、エラーの原因を見つけるにはどうすればよいですか?

編集:私は、フリーなしでエラーを取得する方法と、プログラムが実行の最後に到達する方法を尋ねているだけです。

*** glibc detected *** ./prog: double free or corruption (out): 0x09574040 ***
======= Backtrace: =========
/lib/libc.so.6[0x9ca595]
/lib/libc.so.6(cfree+0x59)[0x9ca9d9]
/usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0x2e6c581]
./prog[0x804b2f9]
./prog[0x804b33b]
./prog[0x804b34f]
./prog[0x804b4d5]
./prog[0x804b4ec]
./prog[0x804bb6f]
./prog[0x8049d43]
./prog[0x8049d59]
./prog[0x8049d88]
./prog[0x8049da2]
./prog[0x8049de3]
./prog[0x8049e6f]
./prog[0x8049604]
/lib/libc.so.6(__libc_start_main+0xdc)[0x976e9c]
./prog(__gxx_personality_v0+0x79)[0x8049271]
======= Memory map: ========
002d4000-002d5000 r-xp 002d4000 00:00 0          [vdso]
0093e000-00958000 r-xp 00000000 fd:00 559505     /lib/ld-2.5.so
00958000-00959000 r-xp 00019000 fd:00 559505     /lib/ld-2.5.so
00959000-0095a000 rwxp 0001a000 fd:00 559505     /lib/ld-2.5.so
00961000-00aa0000 r-xp 00000000 fd:00 559506     /lib/libc-2.5.so
00aa0000-00aa2000 r-xp 0013f000 fd:00 559506     /lib/libc-2.5.so
00aa2000-00aa3000 rwxp 00141000 fd:00 559506     /lib/libc-2.5.so
00aa3000-00aa6000 rwxp 00aa3000 00:00 0 
00aa8000-00acd000 r-xp 00000000 fd:00 559513     /lib/libm-2.5.so
00acd000-00ace000 r-xp 00024000 fd:00 559513     /lib/libm-2.5.so
00ace000-00acf000 rwxp 00025000 fd:00 559513     /lib/libm-2.5.so
02dab000-02db6000 r-xp 00000000 fd:00 559517     /lib/libgcc_s-4.1.2-20080825.so.1
02db6000-02db7000 rwxp 0000a000 fd:00 559517     /lib/libgcc_s-4.1.2-20080825.so.1
02db9000-02e99000 r-xp 00000000 fd:00 79091      /usr/lib/libstdc++.so.6.0.8
02e99000-02e9d000 r-xp 000df000 fd:00 79091      /usr/lib/libstdc++.so.6.0.8
02e9d000-02e9e000 rwxp 000e3000 fd:00 79091      /usr/lib/libstdc++.so.6.0.8
02e9e000-02ea4000 rwxp 02e9e000 00:00 0 
08048000-0805c000 r-xp 00000000 fd:00 789714     /home/echelon/correngine/prog
0805c000-0805d000 rw-p 00013000 fd:00 789714     /home/echelon/correngine/prog
09553000-09594000 rw-p 09553000 00:00 0          [heap]
b7fa9000-b7fab000 rw-p b7fa9000 00:00 0 
b7fb4000-b7fb5000 rw-p b7fb4000 00:00 0 
bfbe9000-bfbfe000 rw-p bffea000 00:00 0          [stack]
DONE
DONE2
make: *** [run] Aborted

編集:ありがとう、問題は私がロングショットでバッファをオーバーランしたことでした。これは「破損」を引き起こし、ダブルフリーではありませんでした。

4

1 に答える 1

0

mallocを使用した動的メモリ割り当てがありますが、プログラムに空きがありません

うわあ!ここでやめて!これは深刻な問題であり、プログラムのバグです。この明白なバグがあるときに、他のものが正しく機能しない理由を理解することはそれほど重要ではありません。最初freeに、必要な呼び出しごとに一致する呼び出しを追加して、この問題を修正する必要がありますmallocこれを行った後でのみ、他の問題を解決することを心配する必要があります(まだ存在している場合)!

なぜ/どうすれば無料でこれを入手できますか

これがの使用(または使用の欠如)とは関係のない問題を報告していることはほぼ確実ですfree。エラーメッセージの重要な部分は、実際には破損の部分です。

を使用して要求したメモリのブロックを超えて上書きしているときに、このエラーが発生するのはよくあることですmalloc。たとえば、構造体を保持するためにメモリのブロックを割り当てるつもりでしたが、構造体へのポインタFooにスペースを割り当てただけの場合、実際に割り当てられたスペースの量を超えて書き込みを続け、メモリ内の情報を破壊します。あなたのものではありません。glibcは、メモリ内のそれ自体のデータである可能性が高いもののこの破損を検出し、適合をスローしています。Foo

実際のコードが見えない限り、これがどこで発生しているのかを知ることは不可能です。ただし、コードを調べて、へのすべての呼び出しを検索mallocし、対応するへの呼び出しと一致させるfree場合は、への各呼び出しが正しいことを確認する良い機会でもありmallocます。

プログラムが完了するまで実行されているのはなぜですか

問題が上記で予測したとおりである場合は、未定義動作の領域に入っています。基本的に、これは、言語標準で実行すべきではないと言われていることを実行したことを意味します(自分に属していないメモリを上書きします)。とにかくそれを行ったので、言語標準はあなたのプログラムが実行されたときに何が起こるかについて全く保証を提供しません。それは完全にうまくいくかもしれません。毎回クラッシュする可能性があります。たまにしかクラッシュしないかもしれません。ハードディスク破損する可能性があります。家が火事になり、悪魔が鼻から飛び出す可能性があります。あなたは決して知りません。そのため、未定義動作の呼び出しは絶対に避けてください。怖いだけでなく、コードのバグも示しています。

于 2013-03-19T03:43:27.463 に答える