我在处理一些在 Visual Studio 2012 x64 中使用 freeaddrinfo(...) 的网络代码时遇到问题。代码看起来像这样:
struct addrinfo hints = {0};
hints.ai_family = AF_INET; // only use IPv4
hints.ai_socktype = SOCK_DGRAM;
hints.ai_flags = AI_ADDRCONFIG;
struct addrinfo *res = nullptr;
int status = getaddrinfo(_rIP.c_str(), std::to_string(_port).c_str(), &hints, &res);
if (status == 0)
{
addDestAddress(res->ai_addr);
}
freeaddrinfo(res);
getaddrinfo/freeaddrinfo 在整个代码中的几个地方使用,我保持一致 在 Release模式下崩溃。 addDestAddress的代码如下:
void addDestAddress(const sockaddr *_pAddr)
{
m_vecDestAddrs.push_back(*(sockaddr_storage*)_pAddr);
}
这是 freeaddrinfo 的正确用法吗?如果我删除 freeaddrinfo 调用,一切正常,除了可能的内存泄漏。
编辑 此代码现在可以完美运行。根据 Remy Lebeau 的回答编辑。
struct addrinfo hints = {0};
hints.ai_family = AF_INET; // only use IPv4
hints.ai_socktype = SOCK_DGRAM;
hints.ai_flags = AI_ADDRCONFIG;
struct addrinfo *res = nullptr;
int status = getaddrinfo(_rIP.c_str(), std::to_string(_port).c_str(), &hints, &res);
if (status == 0)
{
if (res->ai_family == AF_INET)
{
addDestAddress((sockaddr_in*)res->ai_addr);
}
freeaddrinfo(res);
}
addDestAddress 的代码如下:
void addDestAddress(const sockaddr_in *_pAddr)
{
sockaddr_storage ssaddr = {0};
memcpy(&ssaddr, _pAddr, sizeof(sockaddr_in));
m_vecDestAddrs.push_back(ssaddr);
}
这仅用于 IPv4 UDP 工作,不需要 IPv6 支持。
最佳答案
来自documentation ,我强调:
Memory allocated by a successful call to this function must be released with a subsequent call to freeaddrinfo.
您没有遵守此说明。您无条件调用 freeaddrinfo
。您必须仅在 getaddrinfo
调用成功时调用 freeaddrinfo
。
关于c++ - Winsock 代码在 freeaddrinfo 中崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24491776/