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