2010-05-12 72 views
1

在我的Windows 7機器上,這個簡單的程序會導致應用程序的內存使用不斷上升,沒有上限。我已經剝離了一切非必要的東西,看起來很明顯,罪魁禍首是Microsoft Iphlpapi函數「GetIpAddrTable()」。每次通話時,都會泄漏一些內存。在循環中(例如檢查對網絡接口列表的更改),它是不可持續的。似乎沒有異步通知API可以完成這項工作,所以現在我面臨着可能不得不將這個邏輯隔離到一個單獨的進程中並定期回收這個進程 - 這是一個醜陋的解決方案。GetIpAddrTable()泄漏內存。如何解決這個問題?

任何想法?

// IphlpLeak.cpp - demonstrates that GetIpAddrTable leaks memory internally: run this and watch 
// the memory use of the app climb up continuously with no upper bound. 
#include <stdio.h> 
#include <windows.h> 
#include <assert.h> 
#include <Iphlpapi.h> 
#pragma comment(lib,"Iphlpapi.lib") 

void testLeak() { 
    static unsigned char buf[16384]; 
    DWORD dwSize(sizeof(buf)); 
    if (GetIpAddrTable((PMIB_IPADDRTABLE)buf, &dwSize, false) == ERROR_INSUFFICIENT_BUFFER) 
    { 
     assert(0); // we never hit this branch. 
     return; 
    } 
} 
int main(int argc, char* argv[]) { 
    for (int i = 0; true; i++) { 
     testLeak(); 
     printf("i=%d\n",i); 
     Sleep(1000); 
    } 
    return 0; 
} 

回答

1

我一直都結束了這個問題:它似乎有從微軟在此事上沒有確認,但即使在調用任何檢索本地IP地址的API時,一個普通的應用程序在Windows 7(不是XP)上不受限制地增長。

所以我解決它的方式 - 現在 - 是用一個特殊的命令行開關啓動我的應用程序的單獨實例,告訴它「檢索IP地址並將它們打印到標準輸出」。我在父應用程序中拖放stdout,孩子退出,泄漏問題得到解決。

但它贏得了「當一個惱人的問題醜陋的解決方案」,至多。

1

只是爲了完整起見,如果你註釋掉整個if塊和sleep會發生什麼內存使用情況?如果在那裏沒有泄漏,那麼我建議你正確的是什麼導致了它。

最糟糕的情況是,報告給MS,看看他們是否可以解決它 - 你有一個很好的簡單測試用例,這比我在大多數錯誤報告中看到的要多得多。

您可能想嘗試的另一件事是檢查錯誤代碼與NO_ERROR而不是特定的錯誤條件。如果你得到一個不同的錯誤比ERROR_INSUFFICIENT_BUFFER,有可能是一個泄漏:

DWORD dwRetVal = GetIpAddrTable((PMIB_IPADDRTABLE)buf, &dwSize, false); 
if (dwRetVal != NO_ERROR) { 
    printf ("ERROR: %d\n", dwRetVal); 
} 
+0

謝謝 - 是的,如果我停止調用GetIpAddrTable,代碼將停止泄漏。檢查備用返回碼的想法很好,但生產代碼確實如此 - 泄漏仍然存在。至於通知微軟...呃,我想我有一些社區義務這樣做,但是爲了解決我的問題,我可以發貨這個產品,這不太實際。 我在考慮完全切換齒輪 - 調用gethostname(),然後gethostbyname()檢索綁定到該名稱的IP列表。它應該就夠了,儘管它留下了這個令人惱火的謎團。 – Stabledog 2010-05-12 04:15:15

2

@Stabledog: 我已經運行你的例子,未經修改,24小時,但沒有觀察到程序的提交大小無限增加。它始終保持在1024千字節以下。這是在Windows 7(32位,沒有Service Pack 1)。

+0

感謝您的支持。因爲這是幾年前,我不記得我是否曾經遇到過問題的根本 - 我在解決方案上發佈的解決方案表明我採取瞭解決方法。這些日子裏,我甚至沒有在Windows上工作,而且我老化的大腦無法保留這些東西的細節! :) – Stabledog 2012-05-31 19:11:13