2010-10-20 2 views
1

я смотрел на образец GetAdaptersInfo() в MSDN:Malloc только один раз для ВСЕХ адаптеров при использовании GetAdaptersInfo()?

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

и заметил, что в то время как образец попытки перебора всех адаптеров, он выделяет память только для первого.

Это ошибка?

Если нет, то почему бы и нет? У всех адаптеров одинаковый размер информации?

Чтобы уточнить мой вопрос: я понял роль двойного вызова malloc в образце. Я не понимаю, почему это вне цикла. Если в системе есть только один адаптер, то, конечно, проблем нет. Но что происходит, когда есть несколько адаптеров? Это ошибка?

Спасибо.

+0

Я не вижу никаких проблем. Цикл выполняется только по уже полученным адаптерам; он не пытается получить больше.Как правило, вы перебираете распределение по мере того, как содержимое может меняться во время работы, но маловероятно, что в систему будет добавлено больше адаптеров, в то время как вы перечисляете их, чтобы, вероятно, было безопасно только с двумя распределениями. – Luke

ответ

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 в выборке, прежде чем я разместил свой вопрос. Я не понимаю, почему это ** вне цикла **. Если в системе есть только один адаптер, то, конечно, проблем нет. Но что происходит, когда есть несколько адаптеров? Это ошибка? –

+1

@Android - нет, второй вызов возвращает информацию обо всех адаптерах за один раз, причем каждая структура связана со следующей, даже если они находятся в одном блоке памяти. –

+0

@Steven, +1 для ссылки на мой конкретный вопрос. С вашей помощью я смог наконец определить крошечную ссылку в документации на тот факт, что pOutBufLen связан с размером информации всех адаптеров: на самом деле это описание pAdapterInfo: «Указатель на буфер, который получает связанный список структур IP_ADAPTER_INFO ". –

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

EDIT

После прочтения комментария Стива я выглядел немного ближе, и кажется, что код неверно вызова функции GetAdaptersInfo дважды. В случае 1 адаптера первый вызов может потенциально привести к успеху, устраняя необходимость второго вызова.

+0

вот что я подумал, но оптимизация не используется afai может видеть. 2 вызова всегда происходят. –

+0

@ Да, это действительно странно. Похож на ошибку в образце IMHO – JaredPar

+0

спасибо - я понял роль двойного вызова malloc в образце. Я не понимаю, почему это ** вне цикла **. Если в системе есть только один адаптер, то, конечно, проблем нет. Но что происходит, когда есть несколько адаптеров? Это ошибка? –

2

Одна вещь, которую следует отметить в этом примере кода, состоит в том, что, если число переходов увеличивается между вызовами в GetAdaptersInfo, вы запустите свой буфер. Это крайне маловероятно, но код должен по-прежнему проверять это условие.

+0

Отличная точка. Это то, что отличает программу «ОК» и превосходную. –

Смежные вопросы