gpt4 book ai didi

c++ - WinHttpOpen 泄漏内存

转载 作者:太空狗 更新时间:2023-10-29 21:03:58 26 4
gpt4 key购买 nike

我一直在尝试调试程序中的内存泄漏,并将其缩小到 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 上运行代码。

最佳答案

如果稍微修改一下代码,您就会看到发生了什么。

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;
}

随着创建/关闭一百万个 session ,您会看到计数器不断攀升。 API创建包括线程在内的后台资源,并没有立即释放它们,所以它们不断堆积。

但是,一旦您停止创建新 session 并让它有几秒钟的空闲时间 - 您就会看到所有内存都已释放。

最重要的是,在实际代码中,您不应该为每件小事创建一个单独的 session 。一个 session 可能承载多个连接和请求。

关于c++ - WinHttpOpen 泄漏内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12652868/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com