静态分配的构造函数和析构函数顺序
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
的最后一行。
【讨论】:
以上是关于静态分配的构造函数和析构函数顺序的主要内容,如果未能解决你的问题,请参考以下文章