2010-08-01 210 views
0

我有以下代码:C++静态成员

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 ...声明后调用?


更新:

我想实现的功能,一旦调用机制,我觉得写东西像

static core::CallOnce(parameters)其中CallOnce是一个类的名字将是非常好的。

在我看来,写作static core::CallOnce call_once(parameters)看起来更糟糕,但没关系,这是我无法做任何事情的情况。

谢谢。

回答

12

你的变量需要一个名字:

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

为什么这会立即得到downvoted? – 2010-08-01 04:01:36

+0

@迈克尔:好问题。必须找到谁保持downvoting而不留下一个怪异的评论!这是他们的目的! (哦,+1) – 2010-08-01 04:03:00

+0

@詹姆斯你知道的机会,为什么会发生这种情况?为什么不能在构造函数中做一些工作的未命名对象是一个“正常的”静态变量,并且不会被构造 - 破坏? – 2010-08-01 04:07:44

7

你忘了给该载体的名字,所以没有任何变量指向它它的创建

+0

+1也*表示正确的答案。 – 2010-08-01 04:03:45

4

因为std::vector<int>(3)创建一个无名的临时后它立即销毁,它只存在于其包含的表达式的末尾。调试器不能像构造那样在同一行显示破坏,所以它显示在下一行。

给该项目一个名字,并且将会应用正常的static语义。

+0

哈哈 - 不是每个人都马上堆起来! – 2010-08-01 04:01:47