首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数中静态变量的生命周期

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

Stack Overflow用户
提问于 2017-02-03 19:20:49
回答 2查看 360关注 0票数 0

请参阅以下代码:

代码语言:javascript
复制
#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?

有人说:“函数静态变量的生命周期从程序流第一次遇到声明时开始,在程序终止时结束。”

这似乎不是真的!

EN

回答 2

Stack Overflow用户

发布于 2017-02-03 19:22:49

get1()没有调用~T()。证明这一点的简单方法是多次调用get1()

代码语言:javascript
复制
int main()
{
    get1();
    get1();
    get1();
    get2();  
    get2();  
    get2();  
}

上面的代码片段将只显示一次"deconstructor calling"

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

您看到的析构函数调用发生在程序的末尾,也就是get1()中定义的static T x被销毁时。

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

顺便说一句,正确的术语是"destructor".

票数 6
EN

Stack Overflow用户

发布于 2017-02-03 19:25:59

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

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42023055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档