简体   繁体   English

函数主体调用C ++末尾的奇怪循环

[英]Strange looping at end of function body call C++

I am writing a game program in C++ and have encountered an odd problem that seems to be unique to this function. 我正在用C ++写一个游戏程序,遇到了一个奇怪的问题,该问题似乎是该函数所独有的。

When this function is called, it executes just as expected all the way through to the return statement. 调用此函数时,它将一直按预期执行,直到返回语句为止。 However, upon executing the return statement, the code 'jumps' up two lines to the constructor and executes the code between the constructor and the return statement again. 但是,在执行return语句时,代码将跳转两行到构造函数,并再次执行构造函数和return语句之间的代码。 What's more, when I check the value passed to the FileManager constructor on the second iteration, it has the value of 'level_directory' prepended to it (but only inside the constructor, when I check the function call everything is fine). 更重要的是,当我检查第二次迭代传递给FileManager构造函数的值时,它的值前面是'level_directory'的值(但仅构造函数内部 ,当我检查函数调用时,一切都很好)。

Relevant info: 相关信息:

Debugger: GDB 7.6-1
OS: Arch Linux x86_64
IDE: Code::Blocks 12.11

g++ -S -masm=intel main.cpp;cat main.s | g ++ -S -masm = intel main.cpp; cat main.s | c++filt > disasm.s c ++ filt> disasm.s

In file included from game.h:9:0,
                 from main.cpp:4:
playstate.h:32:45: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default]
         const std::string level_directory = "data/levels/";

    .file   "main.cpp"
    .intel_syntax noprefix
    .text
    .globl  main
    .type   main, @function
main:
.LFB1826:
    .cfi_startproc
    .cfi_personality 0x3,__gxx_personality_v0
    .cfi_lsda 0x3,.LLSDA1826
    push    rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    mov rbp, rsp
    .cfi_def_cfa_register 6
    push    rbx
    sub rsp, 552
    .cfi_offset 3, -24
    lea rax, [rbp-560]
    mov rdi, rax
.LEHB0:
    call    _ZN4GameC1Ev
.LEHE0:
    jmp .L2
.L3:
    lea rax, [rbp-560]
    mov rdi, rax
.LEHB1:
    call    _ZN4Game12HandleEventsEv
    lea rax, [rbp-560]
    mov rdi, rax
    call    _ZN4Game6UpdateEv
    lea rax, [rbp-560]
    mov rdi, rax
    call    _ZN4Game6RenderEv
.L2:
    lea rax, [rbp-560]
    mov rdi, rax
    call    _ZN4Game9isRunningEv
.LEHE1:
    test    al, al
    jne .L3
    lea rax, [rbp-560]
    mov rdi, rax
.LEHB2:
    call    _ZN4GameD1Ev
.LEHE2:
    mov eax, 0
    jmp .L9
.L8:
    mov rbx, rax
    lea rax, [rbp-560]
    mov rdi, rax
    call    _ZN4GameD1Ev
    mov rax, rbx
    jmp .L6
.L7:
.L6:
    mov rdi, rax
.LEHB3:
    call    _Unwind_Resume
.LEHE3:
.L9:
    add rsp, 552
    pop rbx
    pop rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE1826:
    .globl  __gxx_personality_v0
    .section    .gcc_except_table,"a",@progbits
.LLSDA1826:
    .byte   0xff
    .byte   0xff
    .byte   0x1
    .uleb128 .LLSDACSE1826-.LLSDACSB1826
.LLSDACSB1826:
    .uleb128 .LEHB0-.LFB1826
    .uleb128 .LEHE0-.LEHB0
    .uleb128 .L7-.LFB1826
    .uleb128 0
    .uleb128 .LEHB1-.LFB1826
    .uleb128 .LEHE1-.LEHB1
    .uleb128 .L8-.LFB1826
    .uleb128 0
    .uleb128 .LEHB2-.LFB1826
    .uleb128 .LEHE2-.LEHB2
    .uleb128 .L7-.LFB1826
    .uleb128 0
    .uleb128 .LEHB3-.LFB1826
    .uleb128 .LEHE3-.LEHB3
    .uleb128 0
    .uleb128 0
.LLSDACSE1826:
    .text
    .size   main, .-main
    .ident  "GCC: (GNU) 4.8.0 20130502 (prerelease)"
    .section    .note.GNU-stack,"",@progbits
                                         ^

and for playstate.cpp 和playstate.cpp

    .file   "playstate.cpp"
    .intel_syntax noprefix
    .section    .text._ZN5StateC2Ev,"axG",@progbits,_ZN5StateC5Ev,comdat
    .align 2
    .weak   _ZN5StateC2Ev
    .type   _ZN5StateC2Ev, @function
_ZN5StateC2Ev:
.LFB1:
    .cfi_startproc
    push    rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    mov rbp, rsp
    .cfi_def_cfa_register 6
    mov QWORD PTR [rbp-8], rdi
    mov rax, QWORD PTR [rbp-8]
    mov QWORD PTR [rax], OFFSET FLAT:_ZTV5State+16
    pop rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE1:
    .size   _ZN5StateC2Ev, .-_ZN5StateC2Ev
    .weak   _ZN5StateC1Ev
    .set    _ZN5StateC1Ev,_ZN5StateC2Ev
    .section    .text._ZN5StateD2Ev,"axG",@progbits,_ZN5StateD5Ev,comdat
    .align 2
    .weak   _ZN5StateD2Ev
    .type   _ZN5StateD2Ev, @function
_ZN5StateD2Ev:
.LFB4:
    .cfi_startproc
    push    rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    mov rbp, rsp
    .cfi_def_cfa_register 6
    sub rsp, 16
    mov QWORD PTR [rbp-8], rdi
    mov rax, QWORD PTR [rbp-8]
    mov QWORD PTR [rax], OFFSET FLAT:_ZTV5State+16
    mov eax, 0
    test    eax, eax
    je  .L2
    mov rax, QWORD PTR [rbp-8]
    mov rdi, rax
    call    _ZdlPv
.L2:
    leave
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE4:
    .size   _ZN5StateD2Ev, .-_ZN5StateD2Ev
    .weak   _ZN5StateD1Ev
    .set    _ZN5StateD1Ev,_ZN5StateD2Ev
    .section    .text._ZN5StateD0Ev,"axG",@progbits,_ZN5StateD0Ev,comdat
    .align 2
    .weak   _ZN5StateD0Ev
    .type   _ZN5StateD0Ev, @function
_ZN5StateD0Ev:
.LFB6:
    .cfi_startproc
    push    rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    mov rbp, rsp
    .cfi_def_cfa_register 6
    sub rsp, 16
    mov QWORD PTR [rbp-8], rdi
    mov rax, QWORD PTR [rbp-8]
    mov rdi, rax
    call    _ZN5StateD1Ev
    mov rax, QWORD PTR [rbp-8]
    mov rdi, rax
    call    _ZdlPv
    leave
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE6:
    .size   _ZN5StateD0Ev, .-_ZN5StateD0Ev
    .section    .rodata
.LC0:
    .string "data/levels/"
    .text
    .align 2
    .globl  _ZN9PlayStateC2Ev
    .type   _ZN9PlayStateC2Ev, @function
_ZN9PlayStateC2Ev:
.LFB1043:
    .cfi_startproc
    .cfi_personality 0x3,__gxx_personality_v0
    .cfi_lsda 0x3,.LLSDA1043
    push    rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    mov rbp, rsp
    .cfi_def_cfa_register 6
    push    rbx
    sub rsp, 40
    .cfi_offset 3, -24
    mov QWORD PTR [rbp-40], rdi
    mov rax, QWORD PTR [rbp-40]
    mov rdi, rax
    call    _ZN5StateC2Ev
    mov rax, QWORD PTR [rbp-40]
    mov QWORD PTR [rax], OFFSET FLAT:_ZTV9PlayState+16
    lea rax, [rbp-17]
    mov rdi, rax
    call    _ZNSaIcEC1Ev
    mov rax, QWORD PTR [rbp-40]
    lea rcx, [rax+8]
    lea rax, [rbp-17]
    mov rdx, rax
    mov esi, OFFSET FLAT:.LC0
    mov rdi, rcx
.LEHB0:
    call    _ZNSsC1EPKcRKSaIcE
.LEHE0:
    lea rax, [rbp-17]
    mov rdi, rax
    call    _ZNSaIcED1Ev
    jmp .L10
.L9:
    mov rbx, rax
    lea rax, [rbp-17]
    mov rdi, rax
    call    _ZNSaIcED1Ev
    mov rax, QWORD PTR [rbp-40]
    mov rdi, rax
    call    _ZN5StateD2Ev
    mov rax, rbx
    mov rdi, rax
.LEHB1:
    call    _Unwind_Resume
.LEHE1:
.L10:
    add rsp, 40
    pop rbx
    pop rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE1043:
    .globl  __gxx_personality_v0
    .section    .gcc_except_table,"a",@progbits
.LLSDA1043:
    .byte   0xff
    .byte   0xff
    .byte   0x1
    .uleb128 .LLSDACSE1043-.LLSDACSB1043
.LLSDACSB1043:
    .uleb128 .LEHB0-.LFB1043
    .uleb128 .LEHE0-.LEHB0
    .uleb128 .L9-.LFB1043
    .uleb128 0
    .uleb128 .LEHB1-.LFB1043
    .uleb128 .LEHE1-.LEHB1
    .uleb128 0
    .uleb128 0
.LLSDACSE1043:
    .text
    .size   _ZN9PlayStateC2Ev, .-_ZN9PlayStateC2Ev
    .globl  _ZN9PlayStateC1Ev
    .set    _ZN9PlayStateC1Ev,_ZN9PlayStateC2Ev
    .align 2
    .globl  _ZN9PlayStateD2Ev
    .type   _ZN9PlayStateD2Ev, @function
_ZN9PlayStateD2Ev:
.LFB1046:
    .cfi_startproc
    .cfi_personality 0x3,__gxx_personality_v0
    .cfi_lsda 0x3,.LLSDA1046
    push    rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    mov rbp, rsp
    .cfi_def_cfa_register 6
    push    rbx
    sub rsp, 24
    .cfi_offset 3, -24
    mov QWORD PTR [rbp-24], rdi
    mov rax, QWORD PTR [rbp-24]
    mov QWORD PTR [rax], OFFSET FLAT:_ZTV9PlayState+16
    mov rax, QWORD PTR [rbp-24]
    add rax, 8
    mov rdi, rax
.LEHB2:
    call    _ZNSsD1Ev
.LEHE2:
    mov rax, QWORD PTR [rbp-24]
    mov rdi, rax
    call    _ZN5StateD2Ev
    mov eax, 0
    test    eax, eax
    je  .L16
    mov rax, QWORD PTR [rbp-24]
    mov rdi, rax
    call    _ZdlPv
    jmp .L16
.L15:
    mov rbx, rax
    mov rax, QWORD PTR [rbp-24]
    mov rdi, rax
    call    _ZN5StateD2Ev
    mov rax, rbx
    mov rdi, rax
.LEHB3:
    call    _Unwind_Resume
.LEHE3:
.L16:
    add rsp, 24
    pop rbx
    pop rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE1046:
    .section    .gcc_except_table
.LLSDA1046:
    .byte   0xff
    .byte   0xff
    .byte   0x1
    .uleb128 .LLSDACSE1046-.LLSDACSB1046
.LLSDACSB1046:
    .uleb128 .LEHB2-.LFB1046
    .uleb128 .LEHE2-.LEHB2
    .uleb128 .L15-.LFB1046
    .uleb128 0
    .uleb128 .LEHB3-.LFB1046
    .uleb128 .LEHE3-.LEHB3
    .uleb128 0
    .uleb128 0
.LLSDACSE1046:
    .text
    .size   _ZN9PlayStateD2Ev, .-_ZN9PlayStateD2Ev
    .globl  _ZN9PlayStateD1Ev
    .set    _ZN9PlayStateD1Ev,_ZN9PlayStateD2Ev
    .align 2
    .globl  _ZN9PlayStateD0Ev
    .type   _ZN9PlayStateD0Ev, @function
_ZN9PlayStateD0Ev:
.LFB1048:
    .cfi_startproc
    push    rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    mov rbp, rsp
    .cfi_def_cfa_register 6
    sub rsp, 16
    mov QWORD PTR [rbp-8], rdi
    mov rax, QWORD PTR [rbp-8]
    mov rdi, rax
    call    _ZN9PlayStateD1Ev
    mov rax, QWORD PTR [rbp-8]
    mov rdi, rax
    call    _ZdlPv
    leave
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE1048:
    .size   _ZN9PlayStateD0Ev, .-_ZN9PlayStateD0Ev
    .align 2
    .globl  _ZN9PlayState5EnterEv
    .type   _ZN9PlayState5EnterEv, @function
_ZN9PlayState5EnterEv:
.LFB1049:
    .cfi_startproc
    push    rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    mov rbp, rsp
    .cfi_def_cfa_register 6
    mov QWORD PTR [rbp-8], rdi
    pop rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE1049:
    .size   _ZN9PlayState5EnterEv, .-_ZN9PlayState5EnterEv
    .align 2
    .globl  _ZN9PlayState5LeaveEv
    .type   _ZN9PlayState5LeaveEv, @function
_ZN9PlayState5LeaveEv:
.LFB1050:
    .cfi_startproc
    push    rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    mov rbp, rsp
    .cfi_def_cfa_register 6
    mov QWORD PTR [rbp-8], rdi
    pop rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE1050:
    .size   _ZN9PlayState5LeaveEv, .-_ZN9PlayState5LeaveEv
    .align 2
    .globl  _ZN9PlayState6ResumeEv
    .type   _ZN9PlayState6ResumeEv, @function
_ZN9PlayState6ResumeEv:
.LFB1051:
    .cfi_startproc
    push    rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    mov rbp, rsp
    .cfi_def_cfa_register 6
    mov QWORD PTR [rbp-8], rdi
    pop rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE1051:
    .size   _ZN9PlayState6ResumeEv, .-_ZN9PlayState6ResumeEv
    .align 2
    .globl  _ZN9PlayState5PauseEv
    .type   _ZN9PlayState5PauseEv, @function
_ZN9PlayState5PauseEv:
.LFB1052:
    .cfi_startproc
    push    rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    mov rbp, rsp
    .cfi_def_cfa_register 6
    mov QWORD PTR [rbp-8], rdi
    pop rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE1052:
    .size   _ZN9PlayState5PauseEv, .-_ZN9PlayState5PauseEv
    .align 2
    .globl  _ZN9PlayState12HandleEventsEv
    .type   _ZN9PlayState12HandleEventsEv, @function
_ZN9PlayState12HandleEventsEv:
.LFB1053:
    .cfi_startproc
    push    rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    mov rbp, rsp
    .cfi_def_cfa_register 6
    mov QWORD PTR [rbp-8], rdi
    pop rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE1053:
    .size   _ZN9PlayState12HandleEventsEv, .-_ZN9PlayState12HandleEventsEv
    .align 2
    .globl  _ZN9PlayState6UpdateEv
    .type   _ZN9PlayState6UpdateEv, @function
_ZN9PlayState6UpdateEv:
.LFB1054:
    .cfi_startproc
    push    rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    mov rbp, rsp
    .cfi_def_cfa_register 6
    mov QWORD PTR [rbp-8], rdi
    pop rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE1054:
    .size   _ZN9PlayState6UpdateEv, .-_ZN9PlayState6UpdateEv
    .align 2
    .globl  _ZN9PlayState6RenderEv
    .type   _ZN9PlayState6RenderEv, @function
_ZN9PlayState6RenderEv:
.LFB1055:
    .cfi_startproc
    push    rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    mov rbp, rsp
    .cfi_def_cfa_register 6
    mov QWORD PTR [rbp-8], rdi
    pop rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE1055:
    .size   _ZN9PlayState6RenderEv, .-_ZN9PlayState6RenderEv
    .align 2
    .globl  _ZN9PlayState9LoadLevelESs
    .type   _ZN9PlayState9LoadLevelESs, @function
_ZN9PlayState9LoadLevelESs:
.LFB1056:
    .cfi_startproc
    .cfi_personality 0x3,__gxx_personality_v0
    .cfi_lsda 0x3,.LLSDA1056
    push    rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    mov rbp, rsp
    .cfi_def_cfa_register 6
    push    rbx
    sub rsp, 600
    .cfi_offset 3, -24
    mov QWORD PTR [rbp-600], rdi
    mov QWORD PTR [rbp-608], rsi
    mov rax, QWORD PTR [rbp-600]
    lea rcx, [rax+8]
    lea rax, [rbp-48]
    mov rdx, QWORD PTR [rbp-608]
    mov rsi, rcx
    mov rdi, rax
.LEHB4:
    call    _ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ERKS6_S8_
.LEHE4:
    lea rcx, [rbp-48]
    lea rax, [rbp-592]
    mov edx, 114
    mov rsi, rcx
    mov rdi, rax
.LEHB5:
    call    _ZN11FileManagerC1ERKSsc
.LEHE5:
    lea rax, [rbp-32]
    lea rcx, [rbp-592]
    mov edx, 32
    mov rsi, rcx
    mov rdi, rax
.LEHB6:
    call    _ZN11FileManager14ReadLineStringEc
    lea rax, [rbp-32]
    mov rdi, rax
    call    _ZNSsD1Ev
.LEHE6:
    nop
    lea rax, [rbp-592]
    mov rdi, rax
.LEHB7:
    call    _ZN11FileManagerD1Ev
.LEHE7:
    lea rax, [rbp-48]
    mov rdi, rax
.LEHB8:
    call    _ZNSsD1Ev
.LEHE8:
    jmp .L34
.L33:
    mov rbx, rax
    lea rax, [rbp-592]
    mov rdi, rax
    call    _ZN11FileManagerD1Ev
    jmp .L29
.L32:
    mov rbx, rax
.L29:
    lea rax, [rbp-48]
    mov rdi, rax
    call    _ZNSsD1Ev
    mov rax, rbx
    jmp .L30
.L31:
.L30:
    mov rdi, rax
.LEHB9:
    call    _Unwind_Resume
.LEHE9:
.L34:
    add rsp, 600
    pop rbx
    pop rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE1056:
    .section    .gcc_except_table
.LLSDA1056:
    .byte   0xff
    .byte   0xff
    .byte   0x1
    .uleb128 .LLSDACSE1056-.LLSDACSB1056
.LLSDACSB1056:
    .uleb128 .LEHB4-.LFB1056
    .uleb128 .LEHE4-.LEHB4
    .uleb128 .L31-.LFB1056
    .uleb128 0
    .uleb128 .LEHB5-.LFB1056
    .uleb128 .LEHE5-.LEHB5
    .uleb128 .L32-.LFB1056
    .uleb128 0
    .uleb128 .LEHB6-.LFB1056
    .uleb128 .LEHE6-.LEHB6
    .uleb128 .L33-.LFB1056
    .uleb128 0
    .uleb128 .LEHB7-.LFB1056
    .uleb128 .LEHE7-.LEHB7
    .uleb128 .L32-.LFB1056
    .uleb128 0
    .uleb128 .LEHB8-.LFB1056
    .uleb128 .LEHE8-.LEHB8
    .uleb128 .L31-.LFB1056
    .uleb128 0
    .uleb128 .LEHB9-.LFB1056
    .uleb128 .LEHE9-.LEHB9
    .uleb128 0
    .uleb128 0
.LLSDACSE1056:
    .text
    .size   _ZN9PlayState9LoadLevelESs, .-_ZN9PlayState9LoadLevelESs
    .section    .text._ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ERKS6_S8_,"axG",@progbits,_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ERKS6_S8_,comdat
    .weak   _ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ERKS6_S8_
    .type   _ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ERKS6_S8_, @function
_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ERKS6_S8_:
.LFB1069:
    .cfi_startproc
    .cfi_personality 0x3,__gxx_personality_v0
    .cfi_lsda 0x3,.LLSDA1069
    push    rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    mov rbp, rsp
    .cfi_def_cfa_register 6
    push    rbx
    sub rsp, 40
    .cfi_offset 3, -24
    mov QWORD PTR [rbp-24], rdi
    mov QWORD PTR [rbp-32], rsi
    mov QWORD PTR [rbp-40], rdx
    mov rdx, QWORD PTR [rbp-32]
    mov rax, QWORD PTR [rbp-24]
    mov rsi, rdx
    mov rdi, rax
.LEHB10:
    call    _ZNSsC1ERKSs
.LEHE10:
    mov rdx, QWORD PTR [rbp-40]
    mov rax, QWORD PTR [rbp-24]
    mov rsi, rdx
    mov rdi, rax
.LEHB11:
    call    _ZNSs6appendERKSs
.LEHE11:
    jmp .L39
.L38:
    mov rbx, rax
    mov rax, QWORD PTR [rbp-24]
    mov rdi, rax
    call    _ZNSsD1Ev
    mov rax, rbx
    mov rdi, rax
.LEHB12:
    call    _Unwind_Resume
.LEHE12:
.L39:
    mov rax, QWORD PTR [rbp-24]
    add rsp, 40
    pop rbx
    pop rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE1069:
    .section    .gcc_except_table
.LLSDA1069:
    .byte   0xff
    .byte   0xff
    .byte   0x1
    .uleb128 .LLSDACSE1069-.LLSDACSB1069
.LLSDACSB1069:
    .uleb128 .LEHB10-.LFB1069
    .uleb128 .LEHE10-.LEHB10
    .uleb128 0
    .uleb128 0
    .uleb128 .LEHB11-.LFB1069
    .uleb128 .LEHE11-.LEHB11
    .uleb128 .L38-.LFB1069
    .uleb128 0
    .uleb128 .LEHB12-.LFB1069
    .uleb128 .LEHE12-.LEHB12
    .uleb128 0
    .uleb128 0
.LLSDACSE1069:
    .section    .text._ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ERKS6_S8_,"axG",@progbits,_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ERKS6_S8_,comdat
    .size   _ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ERKS6_S8_, .-_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ERKS6_S8_
    .weak   _ZTV9PlayState
    .section    .rodata._ZTV9PlayState,"aG",@progbits,_ZTV9PlayState,comdat
    .align 32
    .type   _ZTV9PlayState, @object
    .size   _ZTV9PlayState, 88
_ZTV9PlayState:
    .quad   0
    .quad   _ZTI9PlayState
    .quad   _ZN9PlayStateD1Ev
    .quad   _ZN9PlayStateD0Ev
    .quad   _ZN9PlayState5EnterEv
    .quad   _ZN9PlayState5LeaveEv
    .quad   _ZN9PlayState5PauseEv
    .quad   _ZN9PlayState6ResumeEv
    .quad   _ZN9PlayState12HandleEventsEv
    .quad   _ZN9PlayState6UpdateEv
    .quad   _ZN9PlayState6RenderEv
    .weak   _ZTV5State
    .section    .rodata._ZTV5State,"aG",@progbits,_ZTV5State,comdat
    .align 32
    .type   _ZTV5State, @object
    .size   _ZTV5State, 88
_ZTV5State:
    .quad   0
    .quad   _ZTI5State
    .quad   _ZN5StateD1Ev
    .quad   _ZN5StateD0Ev
    .quad   __cxa_pure_virtual
    .quad   __cxa_pure_virtual
    .quad   __cxa_pure_virtual
    .quad   __cxa_pure_virtual
    .quad   __cxa_pure_virtual
    .quad   __cxa_pure_virtual
    .quad   __cxa_pure_virtual
    .weak   _ZTI9PlayState
    .section    .rodata._ZTI9PlayState,"aG",@progbits,_ZTI9PlayState,comdat
    .align 16
    .type   _ZTI9PlayState, @object
    .size   _ZTI9PlayState, 24
_ZTI9PlayState:
    .quad   _ZTVN10__cxxabiv120__si_class_type_infoE+16
    .quad   _ZTS9PlayState
    .quad   _ZTI5State
    .weak   _ZTS9PlayState
    .section    .rodata._ZTS9PlayState,"aG",@progbits,_ZTS9PlayState,comdat
    .type   _ZTS9PlayState, @object
    .size   _ZTS9PlayState, 11
_ZTS9PlayState:
    .string "9PlayState"
    .weak   _ZTS5State
    .section    .rodata._ZTS5State,"aG",@progbits,_ZTS5State,comdat
    .type   _ZTS5State, @object
    .size   _ZTS5State, 7
_ZTS5State:
    .string "5State"
    .weak   _ZTI5State
    .section    .rodata._ZTI5State,"aG",@progbits,_ZTI5State,comdat
    .align 16
    .type   _ZTI5State, @object
    .size   _ZTI5State, 16
_ZTI5State:
    .quad   _ZTVN10__cxxabiv117__class_type_infoE+16
    .quad   _ZTS5State
    .section    .rodata
    .align 8
    .type   _ZZL18__gthread_active_pvE20__gthread_active_ptr, @object
    .size   _ZZL18__gthread_active_pvE20__gthread_active_ptr, 8
_ZZL18__gthread_active_pvE20__gthread_active_ptr:
    .quad   _ZL28__gthrw___pthread_key_createPjPFvPvE
    .weakref    _ZL28__gthrw___pthread_key_createPjPFvPvE,__pthread_key_create
    .ident  "GCC: (GNU) 4.8.0 20130502 (prerelease)"
    .section    .note.GNU-stack,"",@progbits

The function in question: 有问题的功能:

void
PlayState::LoadLevel(const std::string level_name)
{
    std::string full_path = level_directory + level_name;
    FileManager file(full_path, 'r');
    file.ReadLineString(' ');
    return;
}

The constructor for FileManager: FileManager的构造函数:

FileManager::FileManager(const std::string &path, char access_type)
{
    buffer = "";
    file.exceptions(std::fstream::failbit | std::fstream::badbit);
    try
    {
        switch (access_type)
        {
        case 'r':
            file.open(path, std::ios_base::openmode::_S_in);
            break;
        case 'w':
            file.open(path, std::ios_base::openmode::_S_out);
            break;
        default:
            std::cout << "Access type: " << access_type << " not recognised" << std::endl;
            break;
        }
    }
    catch(std::fstream::failure)
    {
        std::cout << "I/O exception in FileManager constructor.\nPlease check that the file exists.\nPath: " << path << "\nAccess type: " << access_type << std::endl;
    }
    return;
}

FileManager::ReadLineString: 文件管理器:: ReadLineString:

/*
Reads the next line and returns it as a string
*/
std::string
FileManager::ReadLineString()
{
    getline(file, buffer);
    return buffer;

}

/*
As above, but allows to use of a delimiter.
*/
std::string
FileManager::ReadLineString(char delimiter)
{
    getline(file, buffer, delimiter);
    return buffer;
}

I would take any such behavior by a debugger with a grain of salt. 我会采取任何带有调试器的行为。 Try adding a print statement inside the constructor. 尝试在构造函数中添加打印语句。 Most likely, you'll find that it's not getting called twice at all. 您很可能会发现它根本没有被调用过两次。 Debuggers easily get confused about what source line they're on. 调试器很容易对它们所在的源代码行感到困惑。

When in doubt, use assembly level stepping in the debugger (ie si / ni in gdb). 如有疑问,请在调试器中使用程序集级步进(即gdb中的si / ni )。 That will remove any doubt what is truly executed. 这将消除任何疑问,真正执行什么。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM