为什么GDB" next"显示构造函数行两次?

时间:2017-04-18 07:38:04

标签: c++ c++11 gdb

使用gdb" next"跟踪下面的代码,

int main(){
    vector<int> a;
    a.push_back(28);
}

第二行vector<int> a显示两次。 请参见屏幕截图enter image description here

有人可以告诉我为什么这条线显示了两次吗?

源代码t.cpp是使用

编译的
  • g ++ -g -std = c ++ 11 t.cpp,
  • 在Ubuntu 16.04 LTS上 用g ++(Ubuntu 5.4.0-6ubuntu1~16.04.4)5.4.0 20160609

我注意到帖子gdb,why "next" show each source line twice?,但没有回答。

提前致谢!

2 个答案:

答案 0 :(得分:5)

因为G ++将对象构造函数的代码分配给与析构函数相同的行,正如“一些程序员老兄”建议的那样。在Compiler Explorer网站上查看生成的程序集。

这可能是因为在离开范围时调用析构函数,这可能导致多个对象在同一行上被销毁。在调试器中多次显示'}'并不是很有用,因为用户无法看到下一个要破坏的对象。

答案 1 :(得分:2)

我遇到了相同的&#34;问题&#34;:该行在调试器中显示两次,因为无论您使用何种调试信息,编译器都会为析构函数生成额外的调试位置(尝试过STABS,DWARF) )或调试级别(尝试最低的-g1)。

但是这种行为可能很有用,因为现在可以进入&#34;进入&#34;析构函数(如果你有调试信息和源代码)。