2013-04-11 33 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 2013-04-11 16:40:25

回答

4

我敢肯定,你不希望這樣的:

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

而是

pTcpTable = (PMIB_TCPTABLE_OWNER_PID)MALLOC(tcpTableSize); 
    //           ^^^^^ sizeof removed. 

它幾乎肯定會崩潰,因爲你改寫別的東西是必要的OS進行清理在退出堆,這就是爲什麼你得到訪問地址9的崩潰。

+0

感謝那個人是這個問題,我不知道我是如何忽視這一點的......雖然編程8小時直接可以做到這一點給你! – user1831704 2013-04-11 16:49:33

0

的問題是在這裏

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

您需要分配tcpTableSize字節,而不是的sizeof(DWORD)

+0

是的,明白了。謝謝! – user1831704 2013-04-11 17:06:55