Есть ли способ сделать что-то для статических членов в конце процесса? - PullRequest
2 голосов
/ 16 декабря 2009

У меня есть класс, который использует libxml2. Он имеет статические члены, которые используются для хранения контекста файла схемы и его анализатора. Я использую valgrind, и он жалуется, что память не освобождается в связи с контекстом схемы. Это потому, что вам нужно освободить эту память самостоятельно. Однако, поскольку эти переменные контекста являются статическими, я не могу освободиться от уничтожения объекта. Есть ли способ вызвать необходимые свободные функции, или я должен просто игнорировать valgrind.

Ответы [ 5 ]

4 голосов
/ 16 декабря 2009

Объявите другой класс в вашем классе, использующем XML. В его деструкторе очистите ваши статические элементы. Теперь передайте внешнему классу другой статический член типа внутреннего класса. Благодаря наличию нетривиального деструктора, он будет очищен при выходе из программы, и, таким образом, будут очищены и другие ваши значения.

class UseLibXml {
  static int xmlvar;

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

  static StaticCleanup static_cleanup;
};

Определите UseLibXml::static_cleanup там же, где вы определяете другие статические переменные, в одном из ваших файлов .cpp.

2 голосов
/ 16 декабря 2009

Установите обработчик atexit и освободите его там. Или игнорировать.

0 голосов
/ 16 декабря 2009

Я предполагаю, что эти статические переменные являются указателями?

Предположим, у вас есть:

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;
        }
};
0 голосов
/ 16 декабря 2009

Я думаю, вы можете игнорировать эти предупреждения, поскольку они не являются утечками памяти. Занятая ими память вернется в ОС, как только ваше приложение выйдет

0 голосов
/ 16 декабря 2009

Если ошибка valgrind обнаруживается после завершения процесса, я бы не беспокоился об этом. Почему контекстные переменные статичны?

Вы можете сгенерировать файл подавлений, который заставит valgrind игнорировать ошибки, связанные с вашими статическими контекстами. Смотрите эту страницу в руководстве valgrind: подавление ошибок

...