如何在示例中用新的替换malloc 我遵循C++ MSDN管理IP地址的参考。示例中的内存分配使用malloc而不是new。我的理解是,在C++中不应该使用MALOC。我如何将这些malloc转换成新的

如何在示例中用新的替换malloc 我遵循C++ MSDN管理IP地址的参考。示例中的内存分配使用malloc而不是new。我的理解是,在C++中不应该使用MALOC。我如何将这些malloc转换成新的,c++,malloc,msdn,C++,Malloc,Msdn,链接: 有关守则: MIB_IPADDRTABLE *pIPAddrTable; DWORD dwSize = 0; DWORD dwRetVal; pIPAddrTable = (MIB_IPADDRTABLE*) malloc( sizeof(MIB_IPADDRTABLE) ); if (GetIpAddrTable(pIPAddrTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) {

链接:

有关守则:

MIB_IPADDRTABLE  *pIPAddrTable;
DWORD            dwSize = 0;
DWORD            dwRetVal;

pIPAddrTable = (MIB_IPADDRTABLE*) malloc( sizeof(MIB_IPADDRTABLE) );

if (GetIpAddrTable(pIPAddrTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER)
{
    free( pIPAddrTable );
    pIPAddrTable = (MIB_IPADDRTABLE *) malloc ( dwSize );
}

if ( (dwRetVal = GetIpAddrTable( pIPAddrTable, &dwSize, 0 )) != NO_ERROR )
{ 
    printf("GetIpAddrTable call failed with %d\n", dwRetVal);
}

printf("IP Address:         %ld\n", pIPAddrTable->table[0].dwAddr);
printf("IP Mask:            %ld\n", pIPAddrTable->table[0].dwMask);
printf("IF Index:           %ld\n", pIPAddrTable->table[0].dwIndex);
printf("Broadcast Addr:     %ld\n", pIPAddrTable->table[0].dwBCastAddr);
printf("Re-assembly size:   %ld\n", pIPAddrTable->table[0].dwReasmSize);

if (pIPAddrTable)
    free(pIPAddrTable);

您不会用新表达式替换
malloc
的这些用法,因为它们不会像
new
那样初始化对象。相反,它们将指向已分配内存的指针传递给
GetIpAddrTable
,这似乎是在进行初始化

<>但是,有一个C++版本的<代码> MalOC ,它只做内存分配:<代码>运算符new < /C>。我将把这些线与它们的替代品配对:

pIPAddrTable = (MIB_IPADDRTABLE*) malloc( sizeof(MIB_IPADDRTABLE) );
pIPAddrTable = (MIB_IPADDRTABLE*) ::operator new( sizeof(MIB_IPADDRTABLE) );

pIPAddrTable = (MIB_IPADDRTABLE *) malloc ( dwSize );
pIPAddrTable = (MIB_IPADDRTABLE*) ::operator new( dwSize );
free
的使用也需要替换为解除分配功能
操作员删除

free( pIPAddrTable );
::operator delete(pIPAddrTable);

如果你想用现代C++重写原来的C风格代码,你应该使用

std::vector
而不是
new[]
(和
malloc

std::vector
非常方便,例如,由于其析构函数,它将自动释放内存(在抛出异常的情况下也是如此),它可以调整大小,等等

这是上述代码的一个示例,它使用
std::vector
而不是
malloc
new[]
(有关详细信息,请参阅代码中的注释):

#包括
#包括
#包括
#include//for std::vector
#pragma注释(lib,“iphlapi.lib”)
int main()
{
//使用std::vector动态分配内存。
std::向量缓冲区(sizeof(MIB_ipaddress));
MIB_IPADDRTABLE*pIPAddrTable=reinterpret_cast(&buffer[0]);
DWORD dwSize=0;
if(getIPAddressTable(pIPAddrTable,&dwSize,0)=错误\u缓冲区不足\u)
{
//将缓冲区大小调整为适当大小
调整缓冲区大小(dwSize);
//缓冲区内存分配后可以重新基于,所以更新基指针
pIPAddrTable=reinterpret_cast(&buffer[0]);
}
德沃德·德雷特瓦尔;
if((dwRetVal=GetIpAddrTable(pIPAddrTable,&dwSize,0))!=NO_错误)
{ 
printf(“GetIPAddressTable调用失败,为%d\n”,dwRetVal);
}
printf(“IP地址:%ld\n”,pIPAddrTable->table[0].dwAddr);
printf(“IP掩码:%ld\n”,pIPAddrTable->table[0].dwMask);
printf(“如果索引:%ld\n”,pIPAddrTable->table[0].dwIndex);
printf(“广播地址:%ld\n”,pIPAddrTable->table[0].dwBCastAddr);
printf(“重新组装大小:%ld\n”,pIPAddrTable->table[0].dwReasmSize);
//
//无需清理内存:
//向量析构函数将自动为我们执行此操作:)
//    
}

(注意,
printf()
可以替换为
std::cout
,但它不如使用
std::vector
而不是
malloc
new[]
)重要。

pIPAddrTable=(MIB_IPADDRTABLE*)=new char[dwSize];还工作吗?然后删除[]pipaddertable;而不是使用<代码> NeX[]/COD>,在现代C++中,你应该使用。
#include <windows.h>
#include <Iphlpapi.h>
#include <stdio.h>
#include <vector>       // for std::vector

#pragma comment(lib, "iphlpapi.lib")

int main()
{
    // Use std::vector to dynamically allocate memory.
    std::vector<BYTE> buffer(sizeof(MIB_IPADDRTABLE));
    MIB_IPADDRTABLE * pIPAddrTable = reinterpret_cast<MIB_IPADDRTABLE*>(&buffer[0]);

    DWORD dwSize = 0;      
    if ( GetIpAddrTable(pIPAddrTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER )
    {
        // Resize buffer to proper size
        buffer.resize(dwSize);        

        // Buffer memory can be re-based after allocation, so update base pointer
        pIPAddrTable = reinterpret_cast<MIB_IPADDRTABLE*>(&buffer[0]);
    }

    DWORD dwRetVal;   
    if ( (dwRetVal = GetIpAddrTable( pIPAddrTable, &dwSize, 0 )) != NO_ERROR )
    { 
        printf("GetIpAddrTable call failed with %d\n", dwRetVal);
    }

    printf("IP Address:         %ld\n", pIPAddrTable->table[0].dwAddr);
    printf("IP Mask:            %ld\n", pIPAddrTable->table[0].dwMask);
    printf("IF Index:           %ld\n", pIPAddrTable->table[0].dwIndex);
    printf("Broadcast Addr:     %ld\n", pIPAddrTable->table[0].dwBCastAddr);
    printf("Re-assembly size:   %ld\n", pIPAddrTable->table[0].dwReasmSize);

    //
    // No need to cleanup memory:
    // std::vector destructor will do that for us automatically :)
    //    
}