2010-05-12 71 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