2009-12-16 96 views
2

我有一個使用libxml2的類。它具有靜態成員,用於保存架構文件及其解析器的上下文。我正在使用valgrind,並且它抱怨說內存不會與模式上下文一起釋放。這是因爲你需要自己釋放內存。但是,由於這些上下文變量是靜態的,我不能釋放對象的銷燬。有沒有辦法調用必要的免費函數,或者我應該忽略valgrind。有沒有辦法在進程結束時對靜態成員做些什麼?

回答

4

在您的XML使用類中聲明另一個類。在它的析構函數中,清理你的靜態成員。現在給外部類另外一個內部類類型的靜態成員。由於有一個非平凡的析構函數,它會在程序退出時被清理乾淨,因此你的其他值也會被清除。

class UseLibXml { 
    static int xmlvar; 

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

    static StaticCleanup static_cleanup; 
}; 

定義您的.cpp文件中的一個UseLibXml::static_cleanup您定義的其他靜態變量一樣的地方。

+0

您有'StaticCleanup'定義爲'struct'而不是'class'嗎? – Dave 2009-12-16 22:10:15

+0

通過使它成爲一個結構體,我不必顯式地將析構函數公開。公共與私有是結構與類之間唯一的區別。 – 2009-12-16 23:06:44

+0

實現了這一點,它的工作原理。謝謝! – Dave 2009-12-17 15:10:09

2

設置一個atexit處理程序並在那裏釋放。或者忽略。

0

如果valgrind錯誤在進程結束時顯示,那麼我不會擔心它。爲什麼上下文變量是靜態的?

您可以生成一個抑制文件,使valgrind忽略與靜態上下文相關的錯誤。請參閱valgrind手冊中的此頁面:suppressing errors

+0

基本上,類是「讀者」有且只有一個程序有效模式。因此,按需閱讀模式並創建解析上下文,但隨後創建的其他讀者不必再次打開該文件。 – Dave 2009-12-17 14:11:19

0

我想你可以忽略這個警告,因爲它們不是內存泄漏。他們佔用的內存將盡快返回到操作系統退出

+0

也就是說,如果應用程序退出。卸載庫並重新加載時會發生什麼? – 2009-12-17 10:54:50

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; 
     } 
}; 
相關問題