类成员函数中的静态本地在类重新分配中幸存下来?
Posted
技术标签:
【中文标题】类成员函数中的静态本地在类重新分配中幸存下来?【英文标题】:Static local in class member function survives class reallocation? 【发布时间】:2009-08-29 02:47:25 【问题描述】:class Foo
public:
void bar();
;
void Foo::bar()
static int n = 0;
printf("%d\n", n++);
int main(int argc, char **argv)
Foo *f = new Foo();
f->bar();
delete f;
f = new Foo();
f->bar();
delete f;
return 0;
在delete
'ing 和new
'ing 再次上课之后,n
是否会重置为0
?还是n
实际上是一个静态类成员(在所有实例中引用相同)?
换句话说,我应该得到
0 0
或
0 1
?
【问题讨论】:
【参考方案1】:由于变量在函数中是静态的,所以它会是0,1因为内存不会因为它是静态的而被删除,即使变量是函数的一部分而不是类的一部分。
即使您删除了一个类的实例,这些函数仍然保留在该类的内存中,因为它们可以被该类的其他实例使用。
【讨论】:
这是有道理的。所以静态局部对于所有的类实例来说确实是一样的,因为它们实际上都在使用同一个函数实例。【参考方案2】:0 1
'n' 实际上是具有不同范围的静态类成员。它本质上与任何其他上下文(成员函数、全局等)的函数中的静态变量相同
【讨论】:
【参考方案3】:'n' 是函数 Foo::bar 中的静态变量。无论您可能创建或销毁多少个 Foo 实例,该函数都只有一个副本。
【讨论】:
以上是关于类成员函数中的静态本地在类重新分配中幸存下来?的主要内容,如果未能解决你的问题,请参考以下文章