C++ GetAdapterAddresses函数使用NEW代替MALLOC

C++ GetAdapterAddresses函数使用NEW代替MALLOC,c++,network-programming,winsock,C++,Network Programming,Winsock,我会使用windows的getAdapterAddresses()函数来获取有关计算机适配器的一些信息。在MSDN页面中有一个关于如何使用它的大例子。但我使用C++,所以我会坚持新< /Cord>关键字,而不是 Malc (C本地)。如何使用new重写使用malloc的部分 编辑1 std::vector<PIP_ADAPTER_ADDRESSES> buffer; ULONG outBufferLen = 0; if (GetAdaptersAddresses(AF_INET,

我会使用windows的
getAdapterAddresses()
函数来获取有关计算机适配器的一些信息。在MSDN页面中有一个关于如何使用它的大例子。但我使用C++,所以我会坚持<代码>新< /Cord>关键字,而不是<代码> Malc (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)
        {
            ...
        }
    }
}

您不能使用
new
/
delete
直接重写该代码,因为引入
new
会导致异常风险,并且该代码不安全。一个愚蠢的方法是调用
::操作符new(size\u t,const nothrow\u t&)
而不是
malloc()
——但这真的很难看


真正的解决方案是使用适当的C++类重写所有代码。code>std::vector非常适合
Paddress
使用
nothrow new
需要一个RAII包装器,用于
lpMsgBuf

。@Als:这经常发生在愚蠢的决定中。@Sharptoth我缺少什么是RAII包装器。你能解释一下吗?@sharptooth好的,但是我如何使用一个函数来接受带有std::vector的原始指针呢?@Stefano:只需调整向量的大小,以容纳足够的数据并获得指向其第一个元素的原始指针-更简单的解决方案是使用
std::vector
,并调整其大小。@MSalters我能做一些类似于我在编辑2中写的事情吗,这是向下舍入而不是向上舍入。除非
exputfferlen
是多个
sizeof(IP_适配器地址)
,否则会出现缓冲区溢出。另外,请注意,从
GetAdaptersAddresses
@MSalters中实际上不会获得
IP_适配器地址[]
,那么,您能给我举个例子说明如何实现vector以使代码正常工作吗?
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)
    {
        ....
    }
}