在我的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