Malloc только один раз для ВСЕХ адаптеров при использовании GetAdaptersInfo ()? - PullRequest
1 голос
/ 21 октября 2010

Я посмотрел на образец GetAdaptersInfo () в MSDN:

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

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

Это ошибка?

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

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

Спасибо.

Ответы [ 3 ]

2 голосов
/ 22 октября 2010

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

0 голосов
/ 21 октября 2010

Это не ошибка - первый вызов - выяснить, какая область данных действительно нужна.

Если этот первый вызов завершится неудачно с 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 голосов
/ 21 октября 2010

Похоже, вам не хватает этой части примера кода.

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 адаптера первый вызов может потенциально привести к успеху, устраняя необходимость во втором вызове.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...