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

Why my CPP running randomly after end of the program

当我尝试在 GDB 中 运行 我的程序时。在主程序结束后,而不是程序结束后,我的程序开始跳回我的主程序中间,然后随机跳转(而不是向前)。 假设我的 main 在 57 和 161 之间有行。当程序完成 161 时,它开始跳到 67 行,然后跳到 64 行,然后是 61 行,然后向前跳到 145,最后跳到 161 行和然后结束程序。程序没有跳转,先是 运行 (57->58->59->..->67->68->69->..->161),然后跳到在 main (161) 结束时,它开始按照我的描述进行跳跃。我没有在我的程序中使用 and goto 或标签。它只是在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. 您使用优化(-O2 或类似标志)构建程序,或者
  2. 你有 class 类型的带有析构函数的局部变量。

如果是第一种情况,您通常会一直观察程序 "jumping around"(不仅仅是在程序末尾),因为编译器会重新安排指令,使得行顺序不再顺序。

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

also have set a break point at my destructor before. And after all the destructor, it start to jumping as what I describe

你可能误会了。当程序跳回时,执行几条stepi命令。您很有可能会进入尚未设置断点的析构函数。