C++ 删除运算符不';似乎不能调用全局运算符delete重载

C++ 删除运算符不';似乎不能调用全局运算符delete重载,c++,C++,以下程序的输出为 Global new 代码似乎没有调用运算符delete。调用::运算符delete直接调用函数,但使用常规的delete运算符不调用函数 我假设这与编译器优化delete调用有关。我试图通过在delete调用之后放置各种代码来测试这一点,包括将a指针重置为不同的表达式。我假设这将使编译器插入删除,否则我们就有漏洞了。还是一样的结果 因此,我假设这是编译器通过相当复杂的分析消除了对delete确实不必要的调用。但是,我想确定一下。我试图从g++读取输出程序集,但无法理解它 请

以下程序的输出为

Global new
代码似乎没有调用
运算符delete
。调用
::运算符delete
直接调用函数,但使用常规的
delete
运算符不调用函数

我假设这与编译器优化
delete
调用有关。我试图通过在
delete
调用之后放置各种代码来测试这一点,包括将
a
指针重置为不同的表达式。我假设这将使编译器插入
删除
,否则我们就有漏洞了。还是一样的结果

因此,我假设这是编译器通过相当复杂的分析消除了对
delete
确实不必要的调用。但是,我想确定一下。我试图从
g++
读取输出程序集,但无法理解它

请解释一下这种现象

#include <iostream>

using namespace std;

void* operator new(size_t size) {
    cout << "Global new\n";
    return malloc(size);
}

void operator delete(void* p) {
    cout << "Global delete\n";
    free(p);
}

void f() {
    int* x = new int;
    delete x;
}

int main(int argc, char** argv) {    
    f();

    return 0;
}

我得到了预期的输出(还有一些警告)。我还得到了全局新建和全局删除。看起来它像预期的那样工作。使用VS2017。也许是一些优化,我会尝试发布版本并让您知道。@noobius@Xilpex我刚刚再次测试了它,我仍然只得到了
全局新的
。只是在底部添加了编译器信息。有什么想法吗?看起来可能是个编译器错误。使用gcc 9.3.0版(Ubuntu9.3.0-10ubuntu2)-我收到了使用默认参数编译的“新建”和“删除”消息。也得到了
    .file   "main.cpp"
    .text
.lcomm _ZStL8__ioinit,1,1
    .section .rdata,"dr"
.LC0:
    .ascii "Global new\12\0"
    .text
    .globl  _Znwy
    .def    _Znwy;  .scl    2;  .type   32; .endef
    .seh_proc   _Znwy
_Znwy:
.LFB1882:
    pushq   %rbp
    .seh_pushreg    %rbp
    movq    %rsp, %rbp
    .seh_setframe   %rbp, 0
    subq    $32, %rsp
    .seh_stackalloc 32
    .seh_endprologue
    movq    %rcx, 16(%rbp)
    leaq    .LC0(%rip), %rdx
    movq    .refptr._ZSt4cout(%rip), %rcx
    call    _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
    movq    16(%rbp), %rcx
    call    malloc
    addq    $32, %rsp
    popq    %rbp
    ret
    .seh_endproc
    .section .rdata,"dr"
.LC1:
    .ascii "Global delete\12\0"
    .text
    .globl  _ZdlPv
    .def    _ZdlPv; .scl    2;  .type   32; .endef
    .seh_proc   _ZdlPv
_ZdlPv:
.LFB1883:
    pushq   %rbp
    .seh_pushreg    %rbp
    movq    %rsp, %rbp
    .seh_setframe   %rbp, 0
    subq    $32, %rsp
    .seh_stackalloc 32
    .seh_endprologue
    movq    %rcx, 16(%rbp)
    leaq    .LC1(%rip), %rdx
    movq    .refptr._ZSt4cout(%rip), %rcx
    call    _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
    movq    16(%rbp), %rcx
    call    free
    nop
    addq    $32, %rsp
    popq    %rbp
    ret
    .seh_endproc
    .globl  _Z1fv
    .def    _Z1fv;  .scl    2;  .type   32; .endef
    .seh_proc   _Z1fv
_Z1fv:
.LFB1884:
    pushq   %rbp
    .seh_pushreg    %rbp
    movq    %rsp, %rbp
    .seh_setframe   %rbp, 0
    subq    $48, %rsp
    .seh_stackalloc 48
    .seh_endprologue
    movl    $4, %ecx
    call    _Znwy
    movq    %rax, -8(%rbp)
    movq    -8(%rbp), %rax
    testq   %rax, %rax
    je  .L6
    movl    $4, %edx
    movq    %rax, %rcx
    call    _ZdlPvy
.L6:
    nop
    addq    $48, %rsp
    popq    %rbp
    ret
    .seh_endproc
    .def    __main; .scl    2;  .type   32; .endef
    .globl  main
    .def    main;   .scl    2;  .type   32; .endef
    .seh_proc   main
main:
.LFB1885:
    pushq   %rbp
    .seh_pushreg    %rbp
    movq    %rsp, %rbp
    .seh_setframe   %rbp, 0
    subq    $32, %rsp
    .seh_stackalloc 32
    .seh_endprologue
    movl    %ecx, 16(%rbp)
    movq    %rdx, 24(%rbp)
    call    __main
    call    _Z1fv
    movl    $0, %eax
    addq    $32, %rsp
    popq    %rbp
    ret
    .seh_endproc
    .def    __tcf_0;    .scl    3;  .type   32; .endef
    .seh_proc   __tcf_0
__tcf_0:
.LFB2377:
    pushq   %rbp
    .seh_pushreg    %rbp
    movq    %rsp, %rbp
    .seh_setframe   %rbp, 0
    subq    $32, %rsp
    .seh_stackalloc 32
    .seh_endprologue
    leaq    _ZStL8__ioinit(%rip), %rcx
    call    _ZNSt8ios_base4InitD1Ev
    nop
    addq    $32, %rsp
    popq    %rbp
    ret
    .seh_endproc
    .def    _Z41__static_initialization_and_destruction_0ii;    .scl    3;  .type   32; .endef
    .seh_proc   _Z41__static_initialization_and_destruction_0ii
_Z41__static_initialization_and_destruction_0ii:
.LFB2376:
    pushq   %rbp
    .seh_pushreg    %rbp
    movq    %rsp, %rbp
    .seh_setframe   %rbp, 0
    subq    $32, %rsp
    .seh_stackalloc 32
    .seh_endprologue
    movl    %ecx, 16(%rbp)
    movl    %edx, 24(%rbp)
    cmpl    $1, 16(%rbp)
    jne .L12
    cmpl    $65535, 24(%rbp)
    jne .L12
    leaq    _ZStL8__ioinit(%rip), %rcx
    call    _ZNSt8ios_base4InitC1Ev
    leaq    __tcf_0(%rip), %rcx
    call    atexit
.L12:
    nop
    addq    $32, %rsp
    popq    %rbp
    ret
    .seh_endproc
    .def    _GLOBAL__sub_I__Znwy;   .scl    3;  .type   32; .endef
    .seh_proc   _GLOBAL__sub_I__Znwy
_GLOBAL__sub_I__Znwy:
.LFB2378:
    pushq   %rbp
    .seh_pushreg    %rbp
    movq    %rsp, %rbp
    .seh_setframe   %rbp, 0
    subq    $32, %rsp
    .seh_stackalloc 32
    .seh_endprologue
    movl    $65535, %edx
    movl    $1, %ecx
    call    _Z41__static_initialization_and_destruction_0ii
    nop
    addq    $32, %rsp
    popq    %rbp
    ret
    .seh_endproc
    .section    .ctors,"w"
    .align 8
    .quad   _GLOBAL__sub_I__Znwy
    .ident  "GCC: (Rev1, Built by MSYS2 project) 9.3.0"
    .def    _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc;    .scl    2;  .type   32; .endef
    .def    malloc; .scl    2;  .type   32; .endef
    .def    free;   .scl    2;  .type   32; .endef
    .def    _ZdlPvy;    .scl    2;  .type   32; .endef
    .def    _ZNSt8ios_base4InitD1Ev;    .scl    2;  .type   32; .endef
    .def    _ZNSt8ios_base4InitC1Ev;    .scl    2;  .type   32; .endef
    .def    atexit; .scl    2;  .type   32; .endef
    .section    .rdata$.refptr._ZSt4cout, "dr"
    .globl  .refptr._ZSt4cout
    .linkonce   discard
.refptr._ZSt4cout:
    .quad   _ZSt4cout