【发布时间】:2015-08-31 18:52:25
【问题描述】:
我有一个简单的函数,可以让我获取服务器上文件的内容。它按我想要的方式工作但是 “Visual Leak Detector”指出在线closeSocket(...)存在内存泄漏。
代码如下:
string executeUrl(const char *url)
{
SOCKET sConnection;
char szHeader[500];
sprintf(szHeader, "GET %s HTTP/1.0\r\n"
"Host: %s\r\n"
"User-Agent: Agent\r\n"
"\r\n", url, HTTPSERVER);
sConnection = HTTPConnectToServer(HTTPSERVER);
if (sConnection == 0)
{
return "";
}
send(sConnection, szHeader, strlen(szHeader), 0);
char reply[1024];
ZeroMemory(reply, 1024);
if (recv(sConnection, reply, 1024, 0) == SOCKET_ERROR)
{
return "";
}
string returnString(reply);
closesocket(sConnection);
WSACleanup();
return returnString;
}
泄露的数据是字符串returnString。所以它要么与字符串相关,要么与closesocket() 相关。
我做了一些阅读,但我无法弄清楚。显然字符串应该照顾好自己,不会导致内存泄漏,不是吗?
编辑:
我尝试了以下代码:http://www.zedwood.com/article/cpp-winsock-basic-http-connection
即使是这段代码也会对我产生内存泄漏。我还测试了一个不同的应用程序(Deleaker),它还告诉我存在相同的内存泄漏。
EDIT2:
刚刚发现它不是唯一一次字符串泄漏内存。这段代码也有问题:
urlString = (string)"http://someurl" + std::wstring_convert<std::codecvt_utf8<wchar_t>>().to_bytes(pcName) + (string)"somefile.php";
泄露的数据正是“urlString”所持有的。我完全糊涂了。
【问题讨论】:
-
确实,字符串不应该泄漏。所以我的钱要么花在 closesocket 上,要么花在检漏仪上。
-
然而,VLD 中的“数据”块完全包含“returnString”中的内容。我通过将其从“回复”更改来确定。
-
尝试使用 Visual Studio Express 2013 和 Visual Leak Detector 2.3“编辑”,“未检测到内存泄漏。” .尝试了这个link,几乎没有修改以根据收到的缓冲区创建字符串 - “未检测到内存泄漏。”
-
我一无所知...也许我的电脑上的某些东西被窃听了。
-
派对迟到了,但我遇到了 wstring_convert 像塞夫一样泄漏的问题!但仅在 x64 版本中,在 32 位和调试中都可以。开始认为这是 MS 实现中的错误。
标签: c++ string sockets memory-leaks