考虑此类用于演示目的:
class test{
private:
int y;
HANDLE handle;
static int x;
public:
test()
int add();
static int sub();
}
test::test() {
[....]
sub = 1;
handle = (HANDLE)_beginthreadex(NULL,0,&test::sub,NULL,0,0);
}
test::sub() {
[....]
_endthreadex(0)
}
我对静态方法/变量有点不确定,现在我有几个问题;
1)如果我创建了一个测试的类实例,然后调用delete test,那么静态变量是否也被清除了?如果没有,我是否需要使用delete()在析构函数中手动清除所有静态变量(或者它是free())?
2)当运行sub()的线程以_endthreadex结束时,是否要对静态方法进行任何手动清理?如您所见,handle变量引用了线程。
提前致谢
答案 0 :(得分:4)
静态变量具有程序生命周期。它们在程序启动时创建,在程序结束时销毁。只有一个存在,而不是单个对象。
答案 1 :(得分:1)
在这种情况下,关键字' static'意味着内存中只有一个变量实例,并且它属于'上课考试。在测试'的实例之后很久已经消失了,变量test :: x将保留在周围,并且可以被其他任何&test;测试'和静态的' function(因为它是一个私有变量)。不需要清理,因为内存中只有这个实例。
如果将其设置为静态的原因是可以在' sub'中访问,则可以将其作为参数传入。或者,您可以通过“测试”测试。实例到线程方法然后它将不再需要是静态的,因为你可以在对象上调用非静态函数。
答案 2 :(得分:0)
静态变量从类的一个实例持久存在,这就是它们为静态的原因。如果您希望它们是特定于实例的,请删除static关键字。
答案 3 :(得分:0)
您应该从不尝试取消分配static
变量。如果您发现自己想要/需要这样做,那么您可能根本不想使用static
。
答案 4 :(得分:0)
static int
会驻留在BSS or Uninitialised Data Section中,正如其他人所建议的那样,它会在程序的生命周期内提供。