1

私はCを初めて使用し、スイッチ付きのgcc4.4.6を使用してLinuxでプログラミングしますgcc -g -std=c89 -Wall ...。このエラーは、次の名前のプログラムの奥深くにある多くの関数で発生しますcompute

*** glibc detected *** ./compute: corrupted double-linked list: 0x0000000001a770b0 ***
======= Backtrace: =========
/lib64/libc.so.6[0x366d475916]
/lib64/libc.so.6[0x366d4786a4]
./compute[0x406987]
./compute[0x407f0d]
./compute[0x408a41]
/lib64/libc.so.6(__libc_start_main+0xfd)[0x366d41ecdd]
./compute[0x401769]
======= Memory map: ========
...

ここにいくつかの擬似コードがあります(コードは非常に長いので、ここでは構造のみを示しています):

myPts = 100;
JDP = malloc( sizeof(double) * myPts);
if (JDP == NULL)
   exit(27);
...
if (testCondition == 1) { /* my execution enters this if stmt here */
   ...
   myPts = 200;
   free(JDP);
   JDP = malloc (sizeof(double) * myPts);
   if (JDP == NULL)
      exit(27);
   myFunction(JDP, ...); /* array JDP is populated here */
   ...
 } else {
    JDP[0]=0;
 }
 myOtherFunction(..., JDP, ...); /* array JDP is used here */
 free(JDP); /* this line produces error shown above */
 return 0;

gdbを使用してコードをステップ実行すると、このエラーは次のコードの2行目に生成されますfree(JDP)。実行は、配列JDPが2回mallocされ、それらの間に空きがあるようなものです。これがエラーの原因でしょうか?私はこれまでこれをやったことがなく、私が犯しているいくつかの単純な間違いがあることを願っています...

更新1

gdbを使用して、最初の無料のmallocと2番目のmallocを介してコードをステップ実行することに特に注意したいので、コードがこれらのステップを通過することを知っています。

上記のデザインパターンに問題がない場合、他にどのようなシナリオでfree()このエラーが発生しますか?

4

2 に答える 2

2

あなたが示したコードには明らかに問題はありません。特にコードパターン

x = malloc(n);
...
if (condition) {
    free(x); 
    x = malloc(m);
}
...
free(x);

それ自体は間違っていません。

あなたはほぼ間違いなく、あなたが示さなかったコードのどこかで単純な間違いを犯しました。それはメモリの破損を引き起こしました。幸いなことに、そのような間違いを自動的に見つけるための優れたツールがあります。それはと呼ばれvalgrindます。このツールでプログラムを実行します。それがあなたに告げる最初のエラーを修正してください。それ以上のエラーが表示されなくなるまで繰り返します。(多くの場合、valgrindの苦情の最初の部分だけが、コードの実際のバグを反映しています。その後の苦情はすべて、元の不正なメモリアクセスからの「単なる」フォールアウトです。)

于 2012-11-10T02:58:24.237 に答える
1

変数を2回解放することは、それらの間で別々にマロッキングしている限り、問題ありません。問題は、実際にはそれらの間でマロッキングしていないことだと思います-いくつかの論理スイッチ(if / else / while)が発生を妨げているmallocためfree、同じポインターで2回発生します。

于 2012-11-10T02:55:23.930 に答える