2010-08-01 2 views
0

У меня есть следующий код:статические члены Си ++

void Foo() { 

    static std::vector<int>(3); 

    // Vector object is constructed every function call 

    // The destructor of the static vector is invoked at 
    // this point (the debugger shows so) 
    // <------------------- 

    int a; 
} 

Тогда-то я называю Foo несколько раз в последовательности

Почему векторный объект получает построенный на каждом Foo() вызова и почему это деструктор, вызванный сразу после объявления static ...?


Update:

Я пытался реализовать функцию однажды вызова механизма, и я думал, что писать что-то вроде

static core::CallOnce(parameters) где CallOnce это имя класса будет очень приятно.

На мой взгляд, письмо static core::CallOnce call_once(parameters) выглядит хуже, но все в порядке, я не могу ничего с этим поделать.

спасибо.

ответ

12

Ваша переменная нуждается имя:

static std::vector<int> my_static_vector(3); 
+4

Почему это произошло мгновенно? –

+0

@Michael: Хороший вопрос. Должен найти того, кто держит downvoting, не оставляя лишнего COMMENT! Для этого они нужны! (О, и +1) –

+0

@James Знаете ли вы, случайно, почему это происходит? Почему не может быть назван неназванный объект, который выполняет некоторую работу в конструкторе как «обычную» статическую переменную и не может быть сконструирован-разрушен? –

7

Вы забыли дать вектор имя, так что без какой-либо переменной, указывающей на него сразу уничтожен после его создания

+0

+1 для * также * правильный ответ. –

4

Поскольку std::vector<int>(3) создает неназванный временный характер, который живет только до конца содержащегося в нем выражения. Отладчик не может показать уничтожение в той же строке, что и конструкция, поэтому он отображает его на следующей строке.

Дайте элементу имя и нормальную применимую семантику static.

+0

Lol - не каждый нагромождает сразу! –