2013-03-28 2 views
2

IP 주소 관리에 대한 C++ msdn 참조를 따르고 있습니다. 이 예제에서 메모리 할당은 new 대신 malloc을 사용합니다. malloc을 C++에서 사용해서는 안된다는 것이 제 이해입니다. 이 malloc을 새로운 것으로 변환하는 방법에 대해 어떻게 생각합니까?예제에서 malloc을 new로 바꾸는 방법

링크 : MSDN REFERENCE

코드 문제 : 그들은 new처럼 객체를 초기화하지 않기 때문에 당신은 새로운 표현malloc 이러한 용도를 대체하지 것이다

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); 
+1

. 'new []'를 사용하는 대신에, _modern C++ _에서는'std :: vector'와 같은 적절한 RAII 컨테이너를 사용해야합니다 (http://stackoverflow.com/a/15690742/1629821). –

답변

3

. 대신 할당 된 메모리에 대한 포인터를 GetIpAddrTable에 전달합니다. 대신 초기화가 수행됩니다.

그러나 메모리 할당 만 수행하는 malloc의 C++ 버전이 있습니다 (operator new). 나는 그들의 교체로 라인을 짝 것이다 : 당신이 원본을 다시 작성하려는 경우

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

pIPAddrTable = (MIB_IPADDRTABLE *) = 새 char [dwSize]; 또한 일하니? [] pIPAddrTable을 삭제하십시오. – Brad

3

: free

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

용도도 해제 기능 operator delete로 교체해야합니다 C 스타일 코드 을 현대 C++으로 사용하는 경우 new[] (및 malloc) 대신 std::vector을 사용해야합니다.

std::vector은 매우 편리합니다. 자동보고 (이 std::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()std::cout로 대체 될 수 있습니다,하지만 std::vector 대신 malloc 또는 new[]을 사용하는 것만 큼 중요하지)

관련 문제