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