请参阅以下代码:
#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?
有人在那里说:&#34;函数静态变量的生命周期从程序流第一次[0]开始遇到声明开始,并在程序终止时结束。&#34;
这在这里似乎不是真的!
答案 0 :(得分:6)
get1()
未调用~T()
。证明它的简单方法是多次调用get1()
:
int main()
{
get1();
get1();
get1();
get2();
get2();
get2();
}
以上代码段仅显示"deconstructor calling"
一次。
为什么
get1
会调用解构函数,但get2
没有?
当static T x
中定义的get1()
被破坏时,析构函数会在程序结束时调用您。
x
中定义的get2()
不会自动销毁,因为它是堆分配的。您需要delete
它,或者更好的是,使用std::unique_ptr
。
答案 1 :(得分:3)
为什么
get1
调用解构函数但get2
不调用?
请注意get1()
和get2()
之间的区别。 get1()
中的静态变量的类型为T
,当它在程序终止时被破坏时,将调用T
的析构函数。
get2()
中的静态变量属于T&
类型(即对T
的引用),并从通过new
构造的对象初始化。当它在程序终止时被破坏时,T
的析构函数将不会被调用。这对于静态变量并不特殊,对于局部变量也是如此。破坏时间不同但行为相同;构造的对象泄露了。