Функция GetAdapterAddresses с NEW вместо MALLOC - PullRequest
0 голосов
/ 24 ноября 2011

Я бы использовал функцию GetAdaptersAddresses() окон, чтобы получить некоторую информацию об адаптерах компьютера. На этой странице MSDN есть большой пример того, как ее использовать. Но я использую C ++, поэтому я бы придерживался ключевого слова new, а не malloc (C native). Как я могу переписать части, которые используют malloc с new?

РЕДАКТИРОВАТЬ 1

std::vector<PIP_ADAPTER_ADDRESSES> buffer;
ULONG outBufferLen = 0;

if (GetAdaptersAddresses(AF_INET, GAA_FLAG_INCLUDE_PREFIX, NULL, NULL, &outBufferLen) == ERROR_BUFFER_OVERFLOW)
{
    buffer.resize(outBufferLen);

    PIP_ADAPTER_ADDRESSES addresses = reinterpret_cast<PIP_ADAPTER_ADDRESSES>(buffer.data());

    if (GetAdaptersAddresses(AF_INET, GAA_FLAG_INCLUDE_PREFIX, NULL, addresses, &outBufferLen) == NO_ERROR)
    {
        for (; addresses != NULL; addresses = addresses->Next)
        {
            ...
        }
    }
}

РЕДАКТИРОВАТЬ 2

ULONG outBufferLen = 0;

if (GetAdaptersAddresses(AF_INET, GAA_FLAG_INCLUDE_PREFIX, NULL, NULL, &outBufferLen) == ERROR_BUFFER_OVERFLOW)
{
    PIP_ADAPTER_ADDRESSES p = new IP_ADAPTER_ADDRESSES[outBufferLen / sizeof(IP_ADAPTER_ADDRESSES)];

    if (GetAdaptersAddresses(AF_INET, GAA_FLAG_INCLUDE_PREFIX, NULL, p, &outBufferLen) == NO_ERROR)
    {
        ....
    }
}

1 Ответ

1 голос
/ 24 ноября 2011

Вы не можете напрямую переписать этот код, используя new / delete, потому что введение new вызовет риск исключений, и этот код не является безопасным для исключений.Глупым способом было бы вызвать ::operator new( size_t, const nothrow_t&) вместо malloc() - но это действительно ужасно.

Реальное решение - переписать весь код, используя надлежащие классы C ++.std::vector подойдет для pAddresses, и вам понадобится обертка RAII для lpMsgBuf.

...