关于delete()一个类实例及其静态方法/变量的问题

时间:2011-01-12 19:24:13

标签: c++ multithreading winapi memory-management static

考虑此类用于演示目的:

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变量引用了线程。

提前致谢

5 个答案:

答案 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中,正如其他人所建议的那样,它会在程序的生命周期内提供。