为什么我的CPP在程序结束后随机运行

时间:2015-09-15 14:16:11

标签: c++ gdb

当我尝试在GDB中运行我的程序时。在主程序结束后,我的程序开始跳回到我的主程序中间,然后随机跳转(而不是向前),而不是程序结束。 假设我的主要在57和161之间有行。当程序结束161时,它开始跳到第67行然后它跳到第64行,然后第61行,然后跳到145,最后跳到第161行,然后结束该计划。该程序没有进行跳跃和首次运行(57-> 58-> 59-> ...-> 67-> 68-> 69-> ...-> 161),之后它到了main(161)的末尾,它开始像我描述的那样跳跃。我没有在我的程序中使用和转到或标记。它只是在main结束后开始随机跳转而不是结束程序。

以下是我的gdb的一些输出:

145   evolve1.RVpotentialSample[0].outputHist((char*)"data/potentialHistS",sampleSize/10);
(gdb) n
67      Action sample1;
(gdb) n
64      velocity_verlet_cell_SBC evolve1(number_of_particles*2,dt,sampleSize);
(gdb) n
61      initial_MC_SBC initial1(number_of_particles,temp,100*number_of_particles);
(gdb) n
145   evolve1.RVpotentialSample[0].outputHist((char*)"data/potentialHistS",sampleSize/10);
(gdb) n
161 }
(gdb) n

我甚至不知道这怎么会发生。 Gdb只是在程序结束时向我展示了一些奇怪的跳跃。感谢您提供任何可能的意见。

1 个答案:

答案 0 :(得分:2)

您观察到的行为有两个常见原因:

  1. 您使用优化(-O2或类似标志)或
  2. 构建了程序
  3. 你有使用析构函数的类类型的局部变量。
  4. 如果是第一种情况,你通常会观察节目"跳转"所有时间(不仅仅是在程序结束时),因为编译器重新排列指令,使得行顺序不再是顺序的。

    在第二种情况下,编译器通常"调用"来自声明变量的同一行的析构函数。

      

    之前也在我的析构函数中设置了一个断点。在所有的析构函数之后,它开始像我描述的那样跳跃

    你可能弄错了。当程序跳回时,执行一些stepi命令。您很可能会在析构函数中登陆,但您没有设置断点。