跨过循环时的gdb怪异 我有这个简单的C++程序: #include <string> #include <iostream> using namespace std; int main() { for (int i = 0; i < 5; i++) { string a = "apple"; cout << a << endl; string b = "banana"; string c = "cherry"; } return 0; } #包括 #包括 使用名称空间std; int main() { 对于(int i=0;i

跨过循环时的gdb怪异 我有这个简单的C++程序: #include <string> #include <iostream> using namespace std; int main() { for (int i = 0; i < 5; i++) { string a = "apple"; cout << a << endl; string b = "banana"; string c = "cherry"; } return 0; } #包括 #包括 使用名称空间std; int main() { 对于(int i=0;i,c++,gdb,C++,Gdb,对于具有析构函数的本地对象,这种情况总是会发生。如果您在其中一个“向后”位置“跨入”,您将输入相应对象的析构函数的代码 它与循环无关。它发生在任何类型的块中。除了前面所说的,您还可以使用类似于查看代码如何转换为机器代码的工具。如果您将它们悬停在一起,则它们所属的部分将突出显示 对于循环中的代码部分: string a = "apple"; // 1 cout << a << endl; // 2 string b = "banana&q

对于具有析构函数的本地对象,这种情况总是会发生。如果您在其中一个“向后”位置“跨入”,您将输入相应对象的析构函数的代码

它与循环无关。它发生在任何类型的块中。

除了前面所说的,您还可以使用类似于查看代码如何转换为机器代码的工具。如果您将它们悬停在一起,则它们所属的部分将突出显示

对于循环中的代码部分:

string a = "apple";  // 1
cout << a << endl;   // 2
string b = "banana"; // 3
string c = "cherry"; // 4

然后在的
块的和处将不会有任何东西被破坏,因为这不会创建对象的实例。
苹果
香蕉
樱桃
在这种情况下通常位于内存中的不同数据部分,直到应用程序退出为止。

调试信息生成中已报告gcc错误:


作为一种解决方法,您可以使用clang而不是gcc,clang生成正确的调试信息,而不会跳回。

对于具有析构函数的本地对象,这种情况总是会发生。它与循环无关,具体来说,它发生在任何类型的块中。是的,您是对的。如果我去掉循环,它仍然会发生。感谢您的解释。
string a = "apple";  // 1
cout << a << endl;   // 2
string b = "banana"; // 3
string c = "cherry"; // 4
// 1 ===============================================================================
        lea     rax, [rbp-23]
        mov     rdi, rax
        call    std::allocator<char>::allocator() [complete object constructor]
        lea     rdx, [rbp-23]
        lea     rax, [rbp-128]
        mov     esi, OFFSET FLAT:.LC0
        mov     rdi, rax
        call    std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<std::allocator<char> >(char const*, std::allocator<char> const&)
        lea     rax, [rbp-23]
        mov     rdi, rax
        call    std::allocator<char>::~allocator() [complete object destructor]
// 2 ===============================================================================
        lea     rax, [rbp-128]
        mov     rsi, rax
        mov     edi, OFFSET FLAT:_ZSt4cout
        call    std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
        mov     esi, OFFSET FLAT:_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
        mov     rdi, rax
        call    std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))
// 3 ===============================================================================
        lea     rax, [rbp-22]
        mov     rdi, rax
        call    std::allocator<char>::allocator() [complete object constructor]
        lea     rdx, [rbp-22]
        lea     rax, [rbp-96]
        mov     esi, OFFSET FLAT:.LC1
        mov     rdi, rax
        call    std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<std::allocator<char> >(char const*, std::allocator<char> const&)
        lea     rax, [rbp-22]
        mov     rdi, rax
        call    std::allocator<char>::~allocator() [complete object destructor]
// 4 ===============================================================================
        lea     rax, [rbp-21]
        mov     rdi, rax
        call    std::allocator<char>::allocator() [complete object constructor]
        lea     rdx, [rbp-21]
        lea     rax, [rbp-64]
        mov     esi, OFFSET FLAT:.LC2
        mov     rdi, rax
        call    std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<std::allocator<char> >(char const*, std::allocator<char> const&)
        lea     rax, [rbp-21]
        mov     rdi, rax
        call    std::allocator<char>::~allocator() [complete object destructor]

// the object constructed in the loop are now destructed again in reverse order

// 4 ===============================================================================
        lea     rax, [rbp-64]
        mov     rdi, rax
        call    std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() [complete object destructor]
// 3 ===============================================================================
        lea     rax, [rbp-96]
        mov     rdi, rax
        call    std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() [complete object destructor]
// 1 ===============================================================================
        lea     rax, [rbp-128]
        mov     rdi, rax
        call    std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() [complete object destructor]
const char *a = "apple";
const char *b = "banana";
const char *c = "cherry";