2010-10-20 75 views
1

我看着GetAdaptersInfo()样品中MSDN:使用GetAdaptersInfo()时,Malloc只有一次适用于所有适配器?

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

,注意到的是,虽然样品尝试通过所有适配器迭代,它仅分配用于第一个存储器。

这是一个错误?

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

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

谢谢。

+0

我没有看到任何问题。循环只遍历它已经获得的适配器;它不是试图获得更多。通常情况下,由于内容在运行时可能会发生变化,因此循环遍历分配,但在枚举时不太可能将更多适配器添加到系统中,因此只需使用两个分配即可。 – Luke 2010-10-20 21:56:18

回答

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,由于某种原因,这会避免第二次调用。

+0

史蒂夫,谢谢。在我发布我的问题之前,我明白了样本中对malloc的双重调用的作用。我不明白的是为什么它在循环之外**。如果系统中只有一个适配器,那当然没有问题。但是当有多个适配器时会发生什么?这是一个错误? – 2010-10-20 21:17:45

+1

@Android - 不,第二次调用一次返回所有适配器的信息,每个结构链接到下一个,即使它们在单个内存块中。 – 2010-10-20 22:23:00

+0

@Steven,+1提到我的具体问题。在您的帮助下,我终于能够发现文档中的微小参考了pOutBufLen与所有适配器的信息大小有关的事实:它实际上在pAdapterInfo的描述中: “指向接收链表的缓冲区的指针IP_ADAPTER_INFO结构“。 – 2010-10-20 23:20:59

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); 

编辑

读史蒂夫的评论后,我看着有点接近,看来,该代码被错误地调用GetAdaptersInfo功能的两倍。在1个适配器的情况下,第一次通话可能会导致成功消除第二次通话的需要。

+0

这就是我的想法,但优化不是阿法可以看到的。 2次通话总是发生。 – 2010-10-20 21:12:49

+0

@是的,这太奇怪了。看起来像样本恕我直言 – JaredPar 2010-10-20 21:15:50

+0

谢谢 - 我明白在样品中的双重调用malloc的作用。我不明白的是为什么它在循环之外**。如果系统中只有一个适配器,当然没有问题。但是当有多个适配器时会发生什么?这是一个错误? – 2010-10-20 21:16:14

2

这个示例代码需要注意的一件事是,如果在调用GetAdaptersInfo之间适配器的数量恰好增加,那么您将运行缓冲区。这是不太可能的,但代码应该仍然检查这种情况。

+0

优秀点。这就是“好程序”和高级程序之间的区别。 – 2010-10-22 14:56:41

相关问题