代码之家  ›  专栏  ›  技术社区  ›  Dave

是否有方法在进程结束时对静态成员执行某些操作?

  •  2
  • Dave  · 技术社区  · 15 年前

    我有一个使用libxml2的类。它有静态成员,用于保存模式文件及其分析器的上下文。我使用的是valgrind,它抱怨内存的释放与模式上下文无关。这是因为你需要自己释放记忆。然而,由于这些上下文变量是静态的,所以我不能随意销毁对象。有没有方法调用必要的自由函数,或者我应该忽略valgrind。

    5 回复  |  直到 15 年前
        1
  •  4
  •   Rob Kennedy    15 年前

    使用类在XML中声明另一个类。在 它的 析构函数,清理静态成员。现在给外部类另一个内部类类型的静态成员。由于有一个非常重要的析构函数,它将在程序退出时被清除,因此您的其他值也将被清除。

    class UseLibXml {
      static int xmlvar;
    
      struct StaticCleanup {
        ~StaticCleanup() {
          CleanUpLibXmlVar(UseLibXml::xmlvar);
        }
      };
    
      static StaticCleanup static_cleanup;
    };
    

    定义 UseLibXml::static_cleanup 在某个.cpp文件中定义其他静态变量的位置。

        2
  •  2
  •   bmargulies    15 年前

    建立一个 atexit 把手放在那里。或者忽略。

        3
  •  0
  •   mch    15 年前

    如果Valgrind错误在流程结束时出现,那么我不会担心它。为什么上下文变量是静态的?

    您可以生成一个抑制文件,使valgrind忽略与静态上下文相关联的错误。参见Valgrind手册中的本页: suppressing errors

        4
  •  0
  •   dimba    15 年前

    我认为你可以忽略这些警告,因为它们不是内存泄漏。一旦应用程序退出,它们占用的内存将返回到操作系统。

        5
  •  0
  •   Loki Astari    15 年前

    我假设这些静态变量是指针?

    假设你有:

    class X
    {
         private:
            static Plop*   staicXData;  // Initialised in the code.
    };
    

    我会把它改成:

    Class X
    {
        private:
            static Plop&  getStatoc()
            {
                static Plop  data;     // Auto created on first use.
                                       // Destroyed on program exit.
                return data;
            }
    };