GetAdapterAddresses函数,使用NEW代替MALLOC

GetAdapterAddresses function with NEW instead of MALLOC

本文关键字:代替 MALLOC NEW 使用 函数 GetAdapterAddresses      更新时间:2023-10-16

我将使用windows的GetAdaptersAddresses()函数来获取有关计算机适配器的一些信息。在这个MSDN页面有一个如何使用它的大例子。但我使用的是c++,所以我会坚持使用new关键字,而不是malloc (C原生)。如何用new重写使用malloc的部分?

编辑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)
    {
        ....
    }
}

您不能直接使用new/delete重写该代码,因为引入new会引发异常风险,并且该代码不安全。一种愚蠢的方法是调用::operator new( size_t, const nothrow_t&)而不是malloc() -但这真的很难看。

真正的解决方案是使用合适的c++类重写所有代码。std::vector将很适合pAddresses,而lpMsgBuf则需要RAII包装器。