Время жизни статической переменной в функции

См. следующий код:

#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 программа вызывает деконструкцию статической переменной?

Я прочитал похожий пост на:

Каково время жизни статической переменной в функции C++?

там кто-то говорит:"Время жизни статических переменных функции начинается в первый раз [0], когда поток программы встречает объявление, и заканчивается при завершении программы".

это не похоже на правду здесь!

2 ответа

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,

пример колиру


Кстати, правильный термин "деструктор".

Зачем get1 вызывает деконструктор, но get2 не делает?

Обратите внимание на разницу между get1() а также get2(), Статическая переменная в get1() имеет тип Tкогда он уничтожается при завершении программы, деструктор T будет вызван.

Статический переменный в get2() имеет тип T& (т.е. ссылка на T) и инициализируется из объекта, созданного с помощью new, Когда он разрушается при завершении программы, деструктор T не будет вызван. Это не является особенным для статической переменной, это также верно для локальной переменной. Время разрушения различно, но поведение одинаково; построенный объект протекает.

Другие вопросы по тегам