C++ 为什么GDB“next”两次显示构造函数行?
当使用gdb跟踪下面的代码时C++ 为什么GDB“next”两次显示构造函数行?,c++,c++11,gdb,C++,C++11,Gdb,当使用gdb跟踪下面的代码时 int main(){ vector<int> a; a.push_back(28); } 第二行向量a显示两次。 请看屏幕截图 有人能告诉我为什么这条线显示了两次吗 源代码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 我注意到了帖子,但没有人回答 提前谢谢 因为G++将对象构造函数
int main(){
vector<int> a;
a.push_back(28);
}
第二行向量a显示两次。
请看屏幕截图
有人能告诉我为什么这条线显示了两次吗
源代码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
我注意到了帖子,但没有人回答
提前谢谢 因为G++将对象构造函数的代码分配给与其析构函数相同的行,正如“一些程序员”所建议的那样。在网站上查看生成的程序集
这可能是因为在离开作用域时调用析构函数,这可能导致在同一行上销毁多个对象。在调试器中多次显示“}”并没有多大帮助,因为用户看不到下一步要销毁哪个对象。因为G++将对象构造函数的代码分配给与其析构函数相同的行,就像“一些程序员”建议的那样。在网站上查看生成的程序集
这可能是因为在离开作用域时调用析构函数,这可能导致在同一行上销毁多个对象。在调试器中多次显示“}”没有多大帮助,因为用户看不到下一步要销毁哪个对象。我遇到了同样的问题:该行在调试器中显示两次,因为编译器会为析构函数生成一个额外的调试位置,而不管您使用的调试信息是什么,DWARF或调试级别尝试了最低的-g1
但是这种行为可能是有用的,因为现在如果你有了析构函数的调试信息和源代码,就可以在析构函数中执行一步。我遇到了同样的问题:该行在调试器中显示两次,因为编译器为析构函数生成了一个额外的调试位置,不管您使用的调试信息是什么,Drawer还是调试级别都是最低的-g1
但是这种行为可能是有用的,因为如果您有调试信息和源,现在就可以进入析构函数。是否可能与函数返回时调用析构函数有关?您可能需要检查生成的机器代码,以查看程序的功能。是否可能与函数返回时调用的析构函数有关?您可能希望检查生成的机器代码以查看程序的功能。是否可以防止GDB第二次显示源代码?调试很烦人。有可能阻止GDB第二次显示源代码吗?调试很烦人。