2

IP アドレスの管理に関する C++ msdn リファレンスに従っています。この例のメモリ割り当てでは、new の代わりに malloc を使用しています。C++ では malloc を使用しないでください。これらの malloc を new に変換するにはどうすればよいですか?

リンク: MSDN リファレンス

問題のコード:

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);
4

2 に答える 2

3

mallocこれらの使用をnew-expressionに置き換えないでください。オブジェクトを初期化しないためnewです。代わりに、割り当てられたメモリへのポインターを に渡しますGetIpAddrTable。これは、代わりに初期化を行うように見えます。

mallocただし、メモリ割り当てのみを行う C++ バージョンがありますoperator new。行とその置換をペアにします。

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も、割り当て解除関数に置き換える必要がありますoperator delete

free( pIPAddrTable );
::operator delete(pIPAddrTable);
于 2013-03-28T19:24:40.407 に答える
3

元の C スタイルのコードを最新の C++を使用して書き直したい場合は、 (and )std::vectorの代わりに使用する必要があります 。new[]malloc

std::vector非常に便利です。たとえば、デストラクタのおかげで (例外がスローされた場合にも) メモリを自動的に解放し、サイズを変更できます。

これは、andstd::vectorの代わりに使用する上記のコードの例です(詳細については、コード内のコメントを参照してください)。mallocnew[]

#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 :)
    //    
}

(は で置き換えることprintf()ができますが、 orの代わりにstd::cout使用するほど重要ではないことに注意してください。)std::vectormallocnew[]

于 2013-03-28T19:43:18.057 に答える