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