2014-10-02 17 views
1

我正在使用我的程序中的wxWidgets進行目錄管理和壓縮/不妥協的文件集合。當我一直在構建我的文件系統時,我注意到每次運行都會發生內存泄漏。經過大量測試後,我意識到,只要我使用與wxFileName相關的任何函數,就會發生內存泄漏。我正在使用wx widgets 3.0.1,我的獨立示例如下。使用任何涉及wxFileName的內存時發生內存泄漏

#include <wx\filename.h> 

int main() 
{ 
    wxFileName::Mkdir("Test"); 
    return 0; 
} 

結果是相同的,如果我做一個wxFileName類的實例。

如何讓wx小部件不會造成內存泄漏?我希望能夠將大量文件打包到一個文件中,並通過各種其他庫(通過將zip解壓縮到臨時文件夾並從中讀取數據)從它們中讀取數據。我還沒有能夠得到任何其他庫來壓縮/解壓縮整個文件夾,所以我真的需要能夠使用wxWidgets而不會發生內存泄漏。

我在另一個線程中看到,視覺工作室調試器錯誤地識別了內存泄漏,但是我通過AQtime運行它,並確認確實存在內存泄漏。

精確調試輸出涉及內存泄漏如下:

Detected memory leaks! 
Dumping objects -> 
{1087} normal block at 0x009B4BC0, 64 bytes long. 
Data: <\+= d+= l+= t+= > 5C 2B 3D 00 64 2B 3D 00 6C 2B 3D 00 74 2B 3D 00 
{1086} normal block at 0x009B4880, 772 bytes long. 
Data: <    > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
{1085} normal block at 0x009B4680, 28 bytes long. 
Data: < H    > 80 48 9B 00 C1 00 00 00 00 00 00 00 CD CD CD CD 
Object dump complete. 
+0

因此*你的問題*中的特定代碼報告爲devstudio和aqtime泄漏內存?假設你在符號調試中構建'wx',devstudio在哪裏說泄漏分配的來源是? – WhozCraig 2014-10-02 04:50:20

+0

@WhozCraig是的,特定的代碼報告內存泄漏。我編輯了原始文章以顯示確切的內存泄漏。我不確定devstudio是什麼。我在調試中構建了wx,但我不知道是否包含了符號(默認情況下是否會發生?)。 此外,從我收集的內存泄漏發生在「wxAnyValueTypeGlobals」。 – Legacyblade 2014-10-02 05:05:09

+0

DevStudio是生成該輸出的東西(實際上,關閉時的CRT調試報告,但您從devstudio的輸出日誌中得到它)。這確實很奇怪。實際上,我更傾向於使用WinDbg和該工具的堆分析父親而不是VS. – WhozCraig 2014-10-02 06:29:16

回答

1

後有點挖掘(這將是挖我做發佈後的問題),我發現,當你使用的wxWidgets而無需創建一個wxWidgets的應用對象,你需要使用下面的兩個功能:

wxInitialize()

wxUninitia麗澤()

所以我的代碼的固定版本如下:

#include <wx/app.h> 

#include <wx\filename.h> 

int main() 
{ 
    wxInitialize(); 

    wxFileName::Mkdir("Waka Waka"); 

    wxUninitialize(); 

    return 0; 
} 

我建議,如果有人正在使用的wxWidgets純粹是文件管理要麼調用構造函數,這些函數和任何類的析構函數處理文件,或者在程序主循環的開始和結尾。

+0

+1不錯的勤奮。 – WhozCraig 2014-10-02 06:29:54

+1

這是正確的,你也可以使用'wxInitializer'類來避免手動調用'wxUninitialize()'。 – 2014-10-02 14:58:20