我正在学习关于回调函数的领域。感谢你们,我学到了很多东西。 我正在使用必须调用回调函数的对象的C ++实例:单个函数,而不是C ++方法,如下所示:
MyObj *obj = new MyObj();
obj->callback(function);
//callback
void funtion()
{
int i = 10;
...
}
我怀疑如下: 如果MyObj的不同实例调用回调,它们是否会使用自己的局部变量创建“function”的不同“实例”?换句话说,每个对象调用在内存中是否有不同的“i = 10”,或者风险是共享相同的“i”?
谢谢
答案 0 :(得分:1)
没有"实例"一个功能。函数,成员或独立的所有局部变量都放在自动存储区域中(也称为#34;在堆栈上#34;)。这些变量保留在自动存储区域中,直到它们不再需要,因为它们的范围已经结束,然后被丢弃。
同时运行你的函数的每个线程都有自己的局部变量副本 - 在你的情况下,每个线程都有自己的i
。
请注意,如果要在多个调用之间共享变量,C ++允许您通过在函数static
内标记变量来实现此目的:
void funtion()
{
static int i = 10;
...
}
现在,function
的所有调用都共享相同的变量i
。此外,i
的值将在多个调用中持续存在:例如,如果一个调用在退出之前将i
设置为20,然后另一个调用进入该函数,则i
的值将为i
保持20而不是10,因为{{1}}的初始化仅在程序的运行时执行一次。