0

この同じプログラムでは、大量のメモリ割り当てが行われるため、以前に問題が発生しました。ほとんどの問題は解決しましたが、まだ 1 つの特定の問題に悩まされています。プログラムを Eclipse で実行すると、コンパイルはうまくいきますが、このメッセージが表示されてクラッシュします。

*** glibc detected *** /home/user/workspace/TTPrueba/Debug/TTPrueba: free(): invalid pointer: 0xb6bc0588 ***

Valgrindで実行すると、これがわかりました

==31580== Process terminating with default action of signal 11 (SIGSEGV)
==31580==  Access not within mapped region at address 0x0
==31580==    at 0x804BEA3: termino (Menu.c:899)
==31580==    by 0x804BE05: computar_transformadas (Menu.c:840)

したがって、問題は、無効なメモリアドレスを解放しようとしているということですが、デバッグモードでステップバイステップで進み、プログラムがクラッシュすることはありません!!!! :(

なぜそのようなことが起こる可能性があるのですか?デバッグ中は機能するのに、実行中は機能しないのはなぜですか? これはかなり奇妙な動作です。

for(phi=0;phi<360;phi++){

      for(j=0;j<par.param1[phi][0];j++){


              for(o=0;o<(par.prueba[phi][j][1]-par.prueba[phi][j][0]);o++){//AQUI 849

                 free(par.pixels[phi][j][o]);//HERE IS LINE 899 WHERE IT ALWAYS CRASHES

                 if(o==(par.prueba[phi][j][1]-par.prueba[phi][j][0]-1))
                     free(par.pixels[phi][j]);

              }


          free(par.prueba[phi][j]);

      }

助けてくれてありがとう!

4

3 に答える 3

0

考えられる理由の 1 つ - デバッガーがメモリ レイアウトを変更している可能性があるため、メモリが破損すると、たまたま「邪魔にならない」場所にある可能性があります。

または、デバッガーにより、割り当てられたメモリがゼロになる可能性がありますが、これは本番環境では発生しない可能性があります。

于 2012-04-11T23:50:25.370 に答える
0

驚くべきことではありません。例えば、par.pixelsφ[j][o]が初期化されていない場合。デバッガー環境では、メモリ レイアウトが異なります。par.pixels[φ][j][o] が 0 になる可能性があるため、free はクラッシュしませんでした。

于 2012-04-11T23:56:41.853 に答える