gpt4 book ai didi

c++ - Winsock 代码在 freeaddrinfo 中崩溃

转载 作者:行者123 更新时间:2023-11-28 02:45:46 24 4
gpt4 key购买 nike

我在处理一些在 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/

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