释放内存问题导致我的c程序崩溃,但调试时它没有崩溃?

时间:2012-04-11 23:44:44

标签: c debugging memory crash valgrind

我之前遇到过同样的程序,因为它会产生大量的内存分配。我摆脱了大多数问题,但我仍遇到一个特殊问题。当我在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]);

      }

感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

一个可能的原因 - 调试器可能正在改变事物的内存布局,所以当内存损坏时,它恰好处于“不在路上”的位置。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我看到的一个问题是,您par.pixels[phi][j][o]o从零开始循环,然后访问 par.pixels[phi][j][0],这些问题已经免费!

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