Время жизни статической переменной в функции
См. следующий код:
#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
не будет вызван. Это не является особенным для статической переменной, это также верно для локальной переменной. Время разрушения различно, но поведение одинаково; построенный объект протекает.