2

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

4

5 回答 5

4

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

class UseLibXml {
  static int xmlvar;

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

  static StaticCleanup static_cleanup;
};

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

于 2009-12-16T19:30:36.600 回答
2

设置一个atexit处理程序并在那里释放。或者忽略。

于 2009-12-16T18:45:18.330 回答
0

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

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

于 2009-12-16T18:47:05.340 回答
0

我认为您可以忽略此警告,因为它们不是内存泄漏。他们占用的内存将在您的应用程序退出后立即返回操作系统

于 2009-12-16T19:32:35.690 回答
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;
        }
};
于 2009-12-16T20:38:55.120 回答