Когда именно вызывается конструктор статического локального объекта?

Возможный дубликат:
Каков срок жизни статической переменной в функции C ++?

Скажем, у нас есть такой код:

Some class {
  Some() { // the ctor code }
};

Some& globalFunction()
{
  static Some gSome;
  return gSome;
}

Когда именно исполняется код ctor? Что касается обычных статических переменных перед main () или в момент, когда мы впервые вызываем globalFunction ()?

Как это на разных платформах и разных компиляторах (cl, gcc, ...)?

Спасибо

-hb-


person Honza Bambas    schedule 17.06.2010    source источник
comment
Dupe stackoverflow.com/questions/246564/   -  person    schedule 17.06.2010


Ответы (1)


Конструктор Some будет запущен при первом вызове globalFunction(). Это обсуждается в документе Скотта Мейера «Эффективный C ++», пункт 4.

Это предусмотрено стандартом.

Учтите, что проблема с деструктором все еще может быть! В общем, невозможно узнать, когда безопасно удалить этот объект, другой поток (возможно, живущий после основного) может вызвать эту функцию после того, как локальная статика была уничтожена, по этой причине эти объекты часто `` просачиваются '', создавая их с «новым».

Но также обратите внимание, что создание подобных статических объектов в любом случае не является потокобезопасным.

Глобальные статические объекты будут созданы перед основными в неопределенном порядке.

person Stephen    schedule 17.06.2010
comment
Спасибо, Стивен, могу я процитировать вас в комментарии об ошибке Mozilla? - person Honza Bambas; 17.06.2010
comment
Этот вопрос напомнил мне отличную статью о синглетонах и безопасности потоков в C ++: drdobbs.com/184405726 и drdobbs.com/184405772 - person fingerprint211b; 17.06.2010
comment
@Honza: конечно, прокомментируйте со ссылкой, я бы хотел это прочитать :) [примечание: здесь есть (как всегда) некоторые особые случаи - особенно часть безопасности потоков ... так что в некоторых особых условиях это может быть нормально] - person Stephen; 17.06.2010
comment
@fingerprint: спасибо за ссылки, я буду их читать позже. - person Stephen; 17.06.2010
comment
@all: FWIW, ответы на повторяющийся вопрос тоже можно прочитать. - person Stephen; 17.06.2010
comment
@Stephen: у этого объекта уже есть четко определенная точка, когда он удаляется (автоматически). Кроме того, он может быть технически не безопасным для потоков, но gcc делает его потокобезопасным, и я видел дискуссии, в которых компилятор MS также скоро сделает его потокобезопасным. Сказать, что порядок глобальной статики не определен, недостаточно. Он определен для определенных ситуаций (в той же единице компиляции). - person Martin York; 17.06.2010
comment
@Martin: вот почему я прокомментировал, что в особых условиях это может быть нормально, но перечислять это было не тем, чем я хотел заниматься. И вы правы, мне следовало быть точнее насчет порядка строительства. - person Stephen; 17.06.2010
comment
@Stephen: прокомментировал ошибку Mozilla 569629. - person Honza Bambas; 17.06.2010