2010-02-17 2 views
9

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

void foo() { 
    static Bar bar; 
} 

ли C++ гарантирует мне, что Бар :: Bar() вызывается бар и бар :: ~ Bar() никогда не вызывается в строке? (До тех пор, пока основные выходы).

Спасибо!

ответ

13

Да. В первый раз выйдет 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).

Смежные вопросы