2013-04-11 4 views
2

끝 부분에 나와있는 코드를 실행하는 동안, 나는 마지막 줄 FREE(pTcpTable);에서 휴식을 얻고 난 계속하면이 오류가 나타납니다 : 0x7737096E에서메모리 할당/오류를 해제 (매우 작은 코드)

"처리되지 않은 예외 (ntdll.dll)에서 netMon.exe : 0xC0000005 : 액세스 위반 읽기 위치 0x00000009. "

crt0dat.c가 열리고이 코드가 표시됩니다 :

void __cdecl __crtExitProcess (
     int status 
     ) 
{ 
     __crtCorExitProcess(status); 

     /* 
     * Either mscoree.dll isn't loaded, 
     * or CorExitProcess isn't exported from mscoree.dll, 
     * or CorExitProcess returned (should never happen). 
     * Just call ExitProcess. 
     */ 

     ExitProcess(status); 
} 

이것은 코드입니다 : 간단한 메모리 할당 및 할당 취소

#include <iostream> 
#include <WinSock2.h> 
#include <IPHlpApi.h> 
#include <Ws2tcpip.h> 

using namespace std; 

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

#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x)) 
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x)) 

int __cdecl main() 
{ 
    PMIB_TCPTABLE_OWNER_PID pTcpTable; 
    DWORD tcpTableSize = 0; 

    char szLocalAddr[128]; 

    struct in_addr IpAddr; 

    pTcpTable = (PMIB_TCPTABLE_OWNER_PID)MALLOC(sizeof(MIB_TCPTABLE_OWNER_PID)); 

    if(pTcpTable == NULL) 
     return 1; 

    tcpTableSize = sizeof(MIB_TCPTABLE_OWNER_PID); 

    if(GetExtendedTcpTable(pTcpTable, &tcpTableSize, FALSE, AF_INET, TCP_TABLE_OWNER_PID_CONNECTIONS, 0) == ERROR_INSUFFICIENT_BUFFER) 
    { 
     FREE(pTcpTable); 

     pTcpTable = (PMIB_TCPTABLE_OWNER_PID)MALLOC(sizeof(tcpTableSize)); 

     if(pTcpTable == NULL) 
      return 1; 
    } 

    if(GetExtendedTcpTable(pTcpTable, &tcpTableSize, FALSE, AF_INET, TCP_TABLE_OWNER_PID_CONNECTIONS, 0) == NO_ERROR) 
    { 
     for(DWORD i = 0; i < pTcpTable->dwNumEntries; i++) 
     { 
      IpAddr.S_un.S_addr = (u_long)pTcpTable->table[i].dwRemoteAddr; 

      InetNtop(AF_INET, &IpAddr, szLocalAddr, 128); 
     } 
    } 

    if(pTcpTable != NULL) 
     FREE(pTcpTable); 

    return 0; 
} 

내가 무슨 잘못 여기 알아낼 수 없습니다, 친절하게 도와주세요!

+0

가 [Valgrind의 (http://valgrind.org/) 같은 것들을 잡기에 아주 좋은 를 할당 할 필요가 여기에있다 이. – kichik

답변

4

난 당신이 원하지 않는 확신 해요 :

pTcpTable = (PMIB_TCPTABLE_OWNER_PID)MALLOC(sizeof(tcpTableSize)); 

하지만를 대신

pTcpTable = (PMIB_TCPTABLE_OWNER_PID)MALLOC(tcpTableSize); 
    //           ^^^^^ sizeof removed. 
당신이 OS가 청소에 필요한 다른 뭔가를 덮어 때문에 거의 확실 충돌

출구에서의 힙 (heap) 이죠. 그래서 주소 9에 액세스하는 것의 충돌이 발생합니다.

+0

문제가 된 사람, 고맙습니다. 간과하는 방법 ... 8 시간 연속 프로그래밍으로 해결할 수 있습니다! – user1831704

0

이 문제는

pTcpTable = (PMIB_TCPTABLE_OWNER_PID)MALLOC(**sizeof**(tcpTableSize)); 

당신은 tcpTableSize 바이트,하지를 sizeof (DWORD)

+0

그래, 알았다. 감사! – user1831704