2

我有单例类,当同时调用一个单例方法不止一次时,这个方法有局部变量。单例的每个方法调用是否都有自己的私有堆栈,我是否需要担心在调用之间共享/混合局部变量数据?

4

4 回答 4

2

在类方法中使用局部变量(是否为单例并不重要)与在常规函数中使用局部变量没有区别。局部变量不会混淆。

于 2011-06-03T07:43:32.843 回答
1

不,您不必担心这一点。更正您的术语:“单例的每个方法调用是否都有自己的私有堆栈” - 不是它自己的堆栈,而是每个方法调用都有自己的堆栈框架,所以你没事。

单例方法与普​​通函数(在 C++ 中)相同。以同样的方式考虑局部变量。

请注意,这不适用于静态局部变量,它们在方法调用之间专门共享。

于 2011-06-03T07:44:19.267 回答
1

每个方法都将获得自己的私有堆栈。唯一关心共享的可能性是类中的静态变量....但是由于你的类是单例的,它也适用于你的类的实例变量。方法的局部变量在堆栈中总是新鲜的,不需要关心它们。

于 2011-06-03T07:44:26.900 回答
1

我不确定你是在谈论递归还是多线程调用,所以我假设你的意思是递归。

每次调用该方法时,任何未声明为静态的局部变量都会在堆栈上分配。它的工作方式是每个调用都有它自己的堆栈“框架”当调用完成时,堆栈框架被释放(并且所有局部变量都被销毁)。

因此,当调用函数 foo() 时,它的局部变量位于堆栈上的一个帧中,我们称它为帧 A。如果 foo 调用自己,则添加另一个帧,我们称它为 B。在第二次调用的生命周期中,两个帧A 和 B 存在,但 A 本质上是休眠的(通常,可以间接修改 A 中的数据,例如通过指针)。当第二个调用退出时,B 框架被释放,A 框架再次变为活动状态。最后,当 top 调用结束时,A 帧消失。

由于堆栈空间有限,您必须小心不要创建超出堆栈可以容纳的帧。如果这样做,则称堆栈“溢出”。

于 2011-06-03T07:50:04.323 回答