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

标签 c++ sockets networking

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

相关文章:

c++ - 为什么 boost::shared_ptr -> 运算符不是内联声明的?

PHP 从 Socket 获取可用字节

c - 如何从 struct sockaddr 生成 struct addrinfo?

java - 使用 TCP 通过网络传输文件(加快传输速度)

c++ - Boost.Asio 文档不存在。这些错误是什么意思?

c++ - QT painter 仅在关闭窗口时更新计时器更新

c++ - DllMain 在注册 COM dll 时卡住

声明模板类后的 C++ 链接器错误

java - 客户端套接字创建在 jdk1.8.0_25 上挂起

mysql - 问题:未在VBA上定义有关套接字的变量