2012-09-29 39 views
3

我一直在调试内存泄漏,在我的程序中,并缩小到WinHttp的通信。我已经能够复制下面的测试代码的问题:WinHttp打开内存泄漏

#include <windows.h> 
#include "winhttp.h" 

void main() { 
    while (1) { 
      HINTERNET send_session = WinHttpOpen(L"asdf", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0); 
      WinHttpCloseHandle(send_session); 
    } 
} 

运行这几秒钟后,程序已在使用超过20MB内存。它为什么这样做? The API指出,在不再需要句柄之后,您需要调用WinHttpCloseHandle - 我正在这样做。

我使用Arch Linux的mingw32的编制,并在Windows 7

+0

20 MB?你如何衡量? –

+0

运行任务管理器并查看进程内存使用情况。 – seanneko

+0

它没有显示任何足够准确的内容来告诉内存泄漏。请参阅http://stackoverflow.com/questions/1984186/what-is-private-bytes-virtual-bytes-working-set –

回答

4

运行代码如果你修改一下代码,你会看到发生了什么。

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    for(INT n = 0; n < 1000000; n++) 
    { 
     if(!(n % 10000)) 
      _tprintf(_T("%d\n"), n/10000); 
     HINTERNET send_session = WinHttpOpen(L"asdf", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0); 
     WinHttpCloseHandle(send_session); 
    } 
    _tprintf(_T("Done\n")); 
    Sleep(INFINITE); 
    return 0; 
} 

随着创建/关闭一百万个会话,您将看到柜台爬升。 API创建包括线程在内的后台资源,不会立即释放它们,因此它们不断堆积。

但是,只要您停止创建新的会话并让它有几秒钟的空闲时间 - 您将看到所有内存被释放。

底线是,在真实的代码中,你不应该为每一件小事情创建一个单独的会话。一个会话可能会承载多个连接和请求。

+0

有趣!感谢您的解释。它似乎很奇怪,即使在调用Close之后,它仍然拥有资源。 – seanneko