статический деструктор - PullRequest
       10

статический деструктор

9 голосов
/ 17 февраля 2010

Предположим, у меня есть:

void foo() {
  static Bar bar;
}

Гарантирует ли c ++, что Bar :: Bar () вызывается на bar, а Bar :: ~ Bar () никогда не вызывается на bar? (До тех пор, пока не пройдут основные выходы).

Спасибо!

1 Ответ

13 голосов
/ 17 февраля 2010

Да. При первом вызове foo() будет построено Bar bar. Затем он будет доступен до тех пор, пока не закончится main(), после чего он будет уничтожен.

Это по сути:

static Bar *bar = 0;
if (!bar)
{
    bar = new Bar;

    // not "real", of course
    void delete_bar(void) { delete bar; }
    atexit(delete_bar);
}

Заметьте, я сказал "по существу"; это, вероятно, не то, что на самом деле происходит (хотя я не думаю, что это слишком далеко).


3.7.1 Статическая продолжительность хранения
1 Все объекты, которые не имеют ни динамической длительности хранения, ни являются локальными, имеют статическую длительность хранения. Хранение этих объектов должно продолжаться в течение всей программы (3.6.2, 3.6.3).

...