函数中静态变量的生命周期

时间:2017-02-03 11:20:49

标签: c++ lifetime static-variables

请参阅以下代码:

#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;

这在这里似乎不是真的!

2 个答案:

答案 0 :(得分:6)

get1()未调用~T()。证明它的简单方法是多次调用get1()

int main()
{
    get1();
    get1();
    get1();
    get2();  
    get2();  
    get2();  
}

以上代码段仅显示"deconstructor calling"一次。

coliru example

  

为什么get1会调用解构函数,但get2没有?

static T x中定义的get1()被破坏时,析构函数会在程序结束时调用您。

x中定义的get2()不会自动销毁,因为它是堆分配的。您需要delete它,或者更好的是,使用std::unique_ptr

coliru example

顺便说一下,正确的术语是&#34;析构函数&#34;

答案 1 :(得分:3)

  

为什么get1调用解构函数但get2不调用?

请注意get1()get2()之间的区别。 get1()中的静态变量的类型为T,当它在程序终止时被破坏时,将调用T的析构函数。

get2()中的静态变量属于T&类型(即对T的引用),并从通过new构造的对象初始化。当它在程序终止时被破坏时,T的析构函数将不会被调用。这对于静态变量并不特殊,对于局部变量也是如此。破坏时间不同但行为相同;构造的对象泄露了。

相关问题