我之前遇到过同样的程序,因为它会产生大量的内存分配。我摆脱了大多数问题,但我仍遇到一个特殊问题。当我在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]);
}
感谢您的帮助!
答案 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]
并释放不再有效的指针。