Время жизни переменных функции static
начинается, когда [0] первый раз поток программы встречает объявление, и заканчивается при завершении программы. Это означает, что среда выполнения должна вести бухгалтерский учет, чтобы разрушить ее, только если она действительно была построена.
Кроме того, поскольку в стандарте сказано, что деструкторы статических объектов должны выполняться в порядке, обратном завершению их построения [1], а порядок построения может зависеть от конкретного запуска программы, порядок конструкции должны быть приняты во внимание.
Пример
struct emitter {
string str;
emitter(const string& s) : str(s) { cout << "Created " << str << endl; }
~emitter() { cout << "Destroyed " << str << endl; }
};
void foo(bool skip_first)
{
if (!skip_first)
static emitter a("in if");
static emitter b("in foo");
}
int main(int argc, char*[])
{
foo(argc != 2);
if (argc == 3)
foo(false);
}
Вывод:
C: ›sample.exe
Создано в foo
Уничтожено в foo
C: ›sample.exe 1
Создано в if
Создано в foo
Уничтожено в foo
Уничтожено в if
C: ›sample.exe 1 2
Создано в foo
Создано в if
Уничтожено в if
Уничтожено в foo
[0]
Поскольку C ++ 98 [2] не имеет ссылки на несколько потоков, как это будет вести себя в многопоточной среде, не указано, и может быть проблематичным, поскольку упоминает Родди.
[1]
C ++ 98 раздел 3.6.3.1
[basic.start.term]
[2]
В C ++ 11 статика инициализируется потокобезопасным способом, это также известно как Magic Statics.
person
Motti
schedule
29.10.2008