在调用构造函数之后调用 C++ 析构函数

C++ destructor called after calling constructor

看例子:

#include <iostream>
int wow=0;
class Foo{
   int cow = 0;
public:
  Foo(){
    std::cout << "Foo +\n";
    cow = 0;
    ++wow;
  }
  Foo(int n){
    std::cout << "Foo has " << n << "\n";
    cow = n;
    ++wow;
  }
  ~Foo(){
     std::cout << cow << " ~ Foo -\n";
   }
  void print(){
    std::cout << cow << " is the foo#\n";
  }
};

int main(){
  void * bar = ::operator new(sizeof(Foo));
  Foo * a = new(bar) Foo;
  *a = Foo(10);
  std::cout << wow << std::endl;
  a->~Foo();
  ::operator delete(bar);
  return 0;
}

并编译和运行它,控制台显示:

Foo+
Foo has 10
10 ~ Foo -
2
10 ~ Foo -

我的问题是,为什么在调用构造函数时调用析构函数?

第一个析构函数调用应该是 0 ~ Foo - 吗?因为那是第一个 Foo 被 Foo(10)?

覆盖

在这个赋值语句中

 *a = Foo(10);

创建了一个类型为 Foo 的临时对象,该对象使用默认的复制赋值运算符分配给表达式 *a 指定的对象(此处未调用复制或移动构造函数) .分配后临时对象被删除。指针a指向的对象的未声明变量cow(好像是classFoo的数据成员)现在包含相同的值10.并且在程序结束时指针a指向的对象也被删除

因此您将收到两条消息

10 ~ Foo -
10 ~ Foo -

第一个由临时对象的析构函数生成,第二个由指针指向的对象生成a