静态分配的构造函数和析构函数顺序

Posted

技术标签:

【中文标题】静态分配的构造函数和析构函数顺序【英文标题】:Constructor and destructor order on static allocation 【发布时间】:2016-09-08 16:15:58 【问题描述】:

我写了这个简单的代码,我期望得到不同的结果。

struct Test 
  int value_;
  Test(): value_(0) 
    std::cout << "Constructor: "<< value_ << "\n";
  

  Test(int value): value_(value) 
    std::cout << "Constructor: "<< value_ << "\n";
  

  ~Test() 
    std::cout << "Destructor: "<< value_ << "\n";
  
;

int main(int argc, char **argv) 
  Test t;
  t = Test(10);
  t = Test(15);
  t = Test(20);
  t = Test(25);

结果:

Constructor: 0
Constructor: 10
Destructor: 10
Constructor: 15
Destructor: 15
Constructor: 20
Destructor: 20
Constructor: 25
Destructor: 25
Destructor: 25

我很惊讶,因为它没想到最后一行会重复。为什么没有调用Destructor: 0

【问题讨论】:

打印构造函数和析构函数时,您需要确保装饰了复制/移动构造函数和复制/移动赋值运算符。 【参考方案1】:

第一个“Destructor:25”来自Test(25)创建的临时对象的销毁;第二个是从已复制到其中的t 的破坏。

除了最后的“Destructor:”行和第一个“Constructor:”之外,所有的输出都来自这些临时对象的创建和销毁。没有“Destructor: 0”,因为你永远不会创建一个值为 0 的临时对象,而当 t 被销毁时,它的值不再是 0。

【讨论】:

Test t; 行创建了一个值为 0 的临时对象, @GlennTeitelbaum 不,它没有。 t 不是临时的。 分析得很有趣,我没有把temporary object当作一个短语来读,只是认为t不会永远存在。【参考方案2】:

第一行对应于临时对象的销毁。

第二行对应t的销毁。

t被破坏时,它的value_25,因为你使用了

t = Test(25);

作为main 的最后一行。

【讨论】:

以上是关于静态分配的构造函数和析构函数顺序的主要内容,如果未能解决你的问题,请参考以下文章

继承和组合混搭的情况下,构造和析构函数的调用顺序

简述构造函数和析构函数的作用

多继承的构造和析构函数调用顺序

虚函数构造和析构函数执行顺序总结

vector 3 构造 析构

基类和派生类中构造函数和析构函数的执行顺序,一图看懂。