有没有办法在流程结束时对静态成员做些什么?

时间:2009-12-16 18:40:28

标签: c++ valgrind libxml2

我有一个使用libxml2的类。它具有静态成员,用于保存模式文件及其解析器的上下文。我正在使用valgrind,它抱怨内存没有与模式上下文一起解除分配。这是因为你需要自己释放内存。但是,由于这些上下文变量是静态的,我无法释放对象的破坏。有没有办法调用必要的自由函数,或者我应该忽略valgrind。

5 个答案:

答案 0 :(得分:4)

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

class UseLibXml {
  static int xmlvar;

  struct StaticCleanup {
    ~StaticCleanup() {
      CleanUpLibXmlVar(UseLibXml::xmlvar);
    }
  };

  static StaticCleanup static_cleanup;
};

UseLibXml::static_cleanup定义为您在其中一个.cpp文件中定义其他静态变量的相同位置。

答案 1 :(得分:2)

设置atexit处理程序并在那里免费。或者忽略。

答案 2 :(得分:0)

如果在进程结束时出现valgrind错误,那么我就不用担心了。为什么上下文变量是静态的?

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

答案 3 :(得分:0)

我认为你可以忽略这个警告,因为它们不是内存泄漏。一旦应用程序退出

,它们占用的内存将返回操作系统

答案 4 :(得分:0)

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

假设你有:

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;
        }
};