Есть ли способ сделать что-то со статическими членами на конце процесса?
У меня есть класс, который использует libxml2. Он имеет статические члены, которые используются для хранения контекста для файла схемы и его синтаксического анализатора. Я использую valgrind, и он жалуется, что память не освобождается в связи с контекстом схемы. Это потому, что вам нужно освободить эту память самостоятельно. Однако, поскольку эти переменные контекста статичны, я не могу освободить от уничтожения объекта. Есть ли способ вызвать необходимые свободные функции, или я должен просто игнорировать valgrind.
5 ответов:
Объявите другой класс в своем классе XML-using. В деструкторе its Очистите статические элементы. Теперь дайте внешнему классу другой статический член типа внутреннего класса. В силу наличия нетривиального деструктора, он будет очищаться по мере выхода из программы, и, таким образом, ваши другие значения тоже будут очищаться.
class UseLibXml { static int xmlvar; struct StaticCleanup { ~StaticCleanup() { CleanUpLibXmlVar(UseLibXml::xmlvar); } }; static StaticCleanup static_cleanup; };
Определите
UseLibXml::static_cleanup
то же самое место, где вы определяете другие статические переменные, в одном из ваших .файлы cpp.
Если ошибка 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; } };