使用GetAdaptersInfo()时,Malloc仅适用于所有适配器一次?

时间:2010-10-20 20:56:21

标签: windows winapi networking malloc

我查看了MSDN中的GetAdaptersInfo()示例:

http://msdn.microsoft.com/en-us/library/aa365917%28VS.85%29.aspx

并注意到,当示例尝试遍历所有适配器时,它只为第一个适配器分配内存。

这是一个错误吗?

如果没有,为什么不呢?所有适配器都具有相同的信息大小吗?

进一步澄清我的问题:我理解样本中对malloc的双重调用的作用。我不明白的是为什么在循环之外。如果系统中只有一个适配器,当然没有问题。但是当有多个适配器时会发生什么?这是一个错误吗?

感谢。

3 个答案:

答案 0 :(得分:2)

此示例代码需要注意的一点是,如果调用GetAdaptersInfo之间的适配器数量增加,则会过度运行缓冲区。这是极不可能的,但代码仍然应该检查这种情况。

答案 1 :(得分:0)

看起来你错过了这部分代码示例。

if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) {
    FREE(pAdapterInfo);
    pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC(ulOutBufLen);
    if (pAdapterInfo == NULL) {
        printf("Error allocating memory needed to call GetAdaptersinfo\n");
        return 1;
    }
}

此代码使用单个分配的适配器调用GetAdaptersInfo。它实质上是针对机器上只有一个适配器的情况进行优化的。在收到ERROR_BUFFER_OVERFLOW返回的情况下,它会更改它的分配ulOutBufLen中指定的大小(由函数调用更新)。

这是更改在多个适配器的情况下分配的内存量的行。

pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC(ulOutBufLen);

编辑

在阅读了Steve的评论后,我看起来更接近了,似乎代码错误地调用了GetAdaptersInfo函数两次。在1个适配器的情况下,第一次调用可能会成功地消除对第二次调用的需要。

答案 2 :(得分:0)

这不是错误 - 第一个调用是找出实际需要多少数据区域。

如果第一次调用失败并显示ERROR_BUFFER_OVERFLOW,它还会告诉您需要多少数据空间来保存所有结果。然后该示例继续重新分配,并再次调用Win32以获取完整列表。这就是这里的代码,在您注意到的迭代之前:

if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) {
    FREE(pAdapterInfo);
    pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC(ulOutBufLen);
    if (pAdapterInfo == NULL) {
        printf("Error allocating memory needed to call GetAdaptersinfo\n");
        return 1;
    }
}

if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR) {

在我看来,在最好的情况下,不需要第二次调用 - 从大多数机器中只有一个网络适配器的时候开始,这是一种合理的方法。在第一次调用时,样本似乎没有检查NO_ERROR,由于某种原因,它会避免第二次调用。