私は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()
このエラーが発生しますか?