请参阅以下代码:
#include <iostream>
using namespace std;
struct T
{
~T()
{
cout << "deconstructor calling\n";
}
};
static T& get1()
{
static T x;
return x;
}
static T& get2()
{
static T& x = *new T;
return x;
}
int main()
{
get1();//calls the deconstructor
get2(); //dosent call the deconstructor
}为什么get1调用解构函数而get2不调用?据我所知,当你终止程序时,静态变量会销毁!但是为什么在调用get1之后,程序会调用静态变量的解构函数呢?
我有一篇类似这篇文章的文章:
What is the lifetime of a static variable in a C++ function?
有人说:“函数静态变量的生命周期从程序流第一次遇到声明时开始,在程序终止时结束。”
这似乎不是真的!
发布于 2017-02-03 19:22:49
get1()没有调用~T()。证明这一点的简单方法是多次调用get1():
int main()
{
get1();
get1();
get1();
get2();
get2();
get2();
}上面的代码片段将只显示一次"deconstructor calling"。
为什么
get1调用解构函数,而get2不调用?
您看到的析构函数调用发生在程序的末尾,也就是get1()中定义的static T x被销毁时。
get2()中定义的x不会自动销毁,因为它是堆分配的。您需要对其执行delete,或者更好的做法是使用std::unique_ptr。
顺便说一句,正确的术语是"destructor".
发布于 2017-02-03 19:25:59
为什么
get1调用解构函数,而get2不调用?
请注意get1()和get2()之间的区别。get1()中的静态变量是T类型的,当它在程序终止时被析构时,将调用T的析构函数。
get2()中的静态变量是T&类型(即对T的引用),并且是从通过new构造的对象初始化的。当它在程序终止时被析构时,T的析构函数不会被调用。这对于静态变量来说不是特别的,对于局部变量也是如此。销毁时间不同,但行为是相同的;构造的对象是泄漏的。
https://stackoverflow.com/questions/42023055
复制相似问题