c ++析构函数在同一个对象上被调用了2次?

use*_*046 -3 c++ destructor c++11

我有以下代码片段:

#include<iostream>
using namespace std;

class Test {

public:

    Test()  { cout << "Constructor is executed\n"; }
    ~Test() { cout << "Destructor is executed\n";}
    void show()  {  this->Test::~Test(); }
};

int main() {

    Test t;
    t.show();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

Constructor is executed
Destructor is executed
Destructor is executed
Run Code Online (Sandbox Code Playgroud)

问题:如果t.show()已经在"this"对象(即当前对象)上调用析构函数,导致"析构函数被执行"显示一次,那么是什么原因导致它第二次显示?在这种情况下哪个对象被破坏了?

Pra*_*han 8

自动变量超出范围时会被销毁.Test t是一个自动变量,在main结束时超出范围.这是第二次调用析构函数.第一次是Test::show因为函数手动破坏指向的对象this.

因为,C++遵循的理念是不为你不使用的东西付费,所以在自动变量超出范围之外调用析构函数之前,没有任何类型的运行时检查.当然,第二个析构函数调用实际发生的是UB.小心鼻子恶魔.