C++ [[noreturn]] 函数调用和析构函数

问题描述 投票:0回答:0

我有一些 C++ 代码,其中我必须确保在退出之前调用特定的析构函数,我想知道它是否在 [[noreturn]] 函数之前被调用。

所以我写了这个简单的虚拟例子

#include <cstdio>
#include <cstdlib>
class A {
        char *i;
public:
        A() : i{new char[4]} {}
        ~A() { delete[] i; }
        void hello() { puts(i); }
};

int func()
{
        A b;
        exit(1);
        b.hello(); // Not reached
}

我用 g++ /tmp/l.cc -S -O0 编译,我得到了这个程序集

    .file   "l.cc"
    .text
    .section    .text._ZN1AC2Ev,"axG",@progbits,_ZN1AC5Ev,comdat
    .align 2
    .weak   _ZN1AC2Ev
    .type   _ZN1AC2Ev, @function
_ZN1AC2Ev:
.LFB18:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    subq    $16, %rsp
    movq    %rdi, -8(%rbp)
    movl    $4, %edi
    call    _Znam
    movq    %rax, %rdx
    movq    -8(%rbp), %rax
    movq    %rdx, (%rax)
    nop
    leave
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE18:
    .size   _ZN1AC2Ev, .-_ZN1AC2Ev
    .weak   _ZN1AC1Ev
    .set    _ZN1AC1Ev,_ZN1AC2Ev
    .text
    .globl  func
    .type   func, @function
func:
.LFB24:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    subq    $16, %rsp
    leaq    -8(%rbp), %rax
    movq    %rax, %rdi
    call    _ZN1AC1Ev
    movl    $1, %edi
    call    exit
    .cfi_endproc
.LFE24:
    .size   func, .-func
    .ident  "GCC: (GNU) 12.2.1 20221121 (Red Hat 12.2.1-4)"
    .section    .note.GNU-stack,"",@progbits

显然没有调用析构函数。

在这种愚蠢的情况下,这无关紧要,但如果我必须在退出前关闭文件怎么办?

c++ assembly x86-64 att noreturn
© www.soinside.com 2019 - 2024. All rights reserved.