【问题标题】:Question about delete() a class instance and its static methods/variables关于 delete() 类实例及其静态方法/变量的问题
【发布时间】:2011-01-12 19:24:13
【问题描述】:

出于演示目的考虑这个类:

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) 如果我创建一个 test 的类实例,然后调用 delete test,静态变量是否也被清理了?如果没有,我是否需要在析构函数中使用 delete() 手动清理所有静态变量(或者是 free())?

2) 当运行 sub() 的线程以 _endthreadex 终止时,是否需要对静态方法进行手动清理?如您所见,句柄变量是指线程。

提前致谢

【问题讨论】:

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


    【解决方案1】:

    静态变量具有程序生命周期。它们在程序启动时创建,在程序结束时销毁。只有一个存在,它不在单个对象中。

    【讨论】:

    • 将静态变量视为全局变量,其名称恰好在类中可能会有所帮助。
    • @Michael -- 我曾经这样想它们,然后我意识到全局指的是范围,而不是生命周期,静态变量可以是私有的。说全局变量是静态的(因为只有一个)比其他方式(因为静态可以是私有的,甚至是函数或文件的本地变量)更准确。
    • 如果您不介意,另一件事是:删除 test() 实例后,您是否必须在“句柄”上调用 CloseHandle(),还是在实例上的 delete() 期间自动清理?
    • 由于test没有析构函数,所以需要关闭它。简单的方法是添加一个析构函数: ~test() { CloseHandle(handle); } 到班级来处理。
    【解决方案2】:

    在这种情况下,关键字“静态”意味着内存中只有一个变量实例,并且它“属于”类测试。 'test' 的实例消失很久之后,变量 test::x 仍将保留,并且可以被任何其他的 'test' 实例和静态 'sub' 函数访问(因为它是一个私有变量)。无需清理,因为内存中只有一个实例。

    如果将其设为静态的原因是它可以在 'sub' 中访问,则可以改为将其作为参数传入。或者,您可以将“测试”实例传递给线程方法,然后它不再需要是静态的,因为您可以在对象上调用非静态函数。

    【讨论】:

      【解决方案3】:

      静态变量从类的一个实例持续到另一个实例,这就是它们是静态的原因。如果您希望它们是特定于实例的,请删除 static 关键字。

      【讨论】:

        【解决方案4】:

        您应该永远尝试释放static 变量。如果您发现自己想要/需要这样做,那么您可能根本不想使用static

        【讨论】:

          【解决方案5】:

          static int 将驻留在BSS or Uninitialised Data Section 中,因此,正如其他人所建议的,它将在程序的生命周期内可用。

          【讨论】:

          • 没有BSS or Uninitialised Data Section 这样的东西,这是您本地的实现细节。它是static storage duration
          • OP 确实提到了 winapi,尽管在 Windows 中,因此是与 IBM PC 兼容的程序......所以我认为我的断言仍然正确?
          • 嗯,ARM 上的 Windows CE 也实现了(部分)WinAPI。它仍然是 PE 格式,因此未初始化的数据部分在这种情况下确实有意义。
          猜你喜欢
          • 1970-01-01
          • 2011-01-10
          • 2016-11-10
          • 1970-01-01
          • 2013-11-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多