Есть ли способ сделать что-то со статическими членами на конце процесса?


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

5 2

5 ответов:

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

class UseLibXml {
  static int xmlvar;

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

  static StaticCleanup static_cleanup;
};

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

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

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

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

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

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

Предполагая, что у вас есть:

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