0

我以前在使用同一个程序时遇到过麻烦,因为它会分配大量内存。我摆脱了大多数问题,但我仍然遇到一个特定问题。当我在 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

这并不奇怪。例如,如果 par.pixels[phi][j][o] 未初始化。它可以包含任何内容,在调试器环境中,您有不同的内存布局 par.pixels[phi][j][o] 可能会变为 0,因此 free 不会崩溃。

于 2012-04-11T23:56:41.853 回答
0

一个可能的原因 - 调试器可能正在更改事物的内存布局,因此当内存损坏时,它恰好位于“不碍事”的地方。

或者调试器可能会导致分配的内存归零,这可能不会在生产运行中发生。

于 2012-04-11T23:50:25.370 回答
0

我看到的一个问题是你 free par.pixels[phi][j][o]whereo从零开始循环,然后access par.pixels[phi][j][0],它刚刚被释放了!

您还释放par.pixels[phi][j]但继续循环访问par.pixels[phi][j]和释放不再有效的指针。

于 2012-04-12T05:59:19.357 回答