當運行在年底上市的代碼,我在最後一行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;
}
我無法弄清楚什麼是錯在這裏,其簡單的內存分配和釋放,請在這裏幫助我!
[Valgrind的(http://valgrind.org/)是捕之類的東西很不錯這個。 – kichik 2013-04-11 16:40:25