(NTDLL.DLL): 0xC0000005: Access Violation.解决办法

(NTDLL.DLL): 0xC0000005: Access Violation.
1秒钟大概可以创建10个左右的线程执行EPCProcessThread,在DEBUG状态下一两分钟将出现Access Violation的报错。运行态不会报错。求解,为什么要跑一会才会出错?应该怎么解决?

struct StTagInfo
{
unsigned char AntennaPort;
unsigned char Channel;
short RSSI;
unsigned char EpcLen;
unsigned char EPC[MAX_EPC_LEN+1];
};

struct StTagInfoGroup
{
int TagCnt;
StTagInfo* p_StTagInfo;
};

static void ReportDataEvent()
{
/*缓冲有数据,并且超时或者缓冲将满时把数据给出去*/
if((gp_StTagInfo - gp_StTagInfoCopy > 0) && 
((timeGetTime() - g_LastTagGetTime >= TAG_REPORT_INTERVAL_TIME)
|| (gp_StTagInfo == gp_StTagInfoCopy + TAG_BUFFER_SIZE - 1)))
{
HANDLE EPCProcessThreadHandle;
DWORD EPCProcessThreadId;
//对外传递数据的接口
StTagInfoGroup* StTagGroup = new StTagInfoGroup();/*delete对象StTagInfoGroup:新建*/

if(StTagGroup == NULL)
{
return;
}

StTagGroup->TagCnt = gp_StTagInfo - gp_StTagInfoCopy;
StTagGroup->p_StTagInfo = gp_StTagInfoCopy;

/*创建线程将标签信息给出去处理*/
EPCProcessThreadHandle = CreateThread(
NULL, // default security attributes
0, // use default stack size
EPCProcessThread, // thread function
StTagGroup, // argument to thread function
0, // use default creation flags
&EPCProcessThreadId);

gp_StTagInfo = NULL;
gp_StTagInfoCopy = NULL;
}
}

static void EPCProcess(CsA6Package* package)
{
//出现异常或命令结束包返回
if ((package->timeout_status != EXEC_SUCCESS) || 
        (package->DataLenght < INV_MIN_DATA_LEN) ||
        (package->Cmd != CMD_INVENTORY))
    {
        return;
    }
    else
    {
        unsigned short PC = ((unsigned short)package->Data[INV_PC_H_OFF] << 8) | package->Data[INV_PC_L_OFF];//PC
        unsigned char EPCLength = GetPureEPCLen(PC);//EPC长度

        if (INV_DATA_LEN(EPCLength) == package->DataLenght)
        {
ReportDataEvent();

if(gp_StTagInfo == NULL)
{
gp_StTagInfo = new StTagInfo[TAG_BUFFER_SIZE];/*delete对象StTagInfo数组:新建*/
if(gp_StTagInfo == NULL)
{
return;
}
gp_StTagInfoCopy = gp_StTagInfo;
g_LastTagGetTime = timeGetTime();
}

if(gp_StTagInfo - gp_StTagInfoCopy >= TAG_BUFFER_SIZE - 1)
{
return;
}

StTagInfo* TagInfo = gp_StTagInfo++;

            TagInfo->AntennaPort = package->Data[INV_ANT_OFF];//天线端口
TagInfo->Channel = package->Data[INV_CHAN_OFF];   //信道
            TagInfo->RSSI = ((short)package->Data[INV_RSSI_H_OFF] << 8) | package->Data[INV_RSSI_L_OFF];//RSSI
TagInfo->EpcLen = EPCLength;
memcpy(TagInfo->EPC, package->Data+INV_EPC_OFF, TagInfo->EpcLen);
        }
    }
}

static DWORD WINAPI EPCProcessThread(LPVOID lpParam)
{
StTagInfoGroup* TagGroup = (StTagInfoGroup*)lpParam;

if(TagGroup != NULL)
{
/*给应用程序处理标签信息*/
if(gp_TagReportHandle != NULL)
{
gp_TagReportHandle(*TagGroup);
}

/*释放内存*/
delete[] TagGroup->p_StTagInfo;/*delete对象StTagInfo数组:释放*/
TagGroup->p_StTagInfo = NULL;
delete TagGroup;/*delete对象StTagInfoGroup:释放*/
/*似乎在这个地方会出现First-chance exception in **.exe (NTDLL.DLL): 0xC0000005: Access Violation.*/
TagGroup = NULL;
}

return NULL;
}

------解决思路----------------------
是不是内存消耗太多引起的!跑起来后,看看内存使用情况!

------解决思路----------------------
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

VMMap 是进程虚拟和物理内存分析实用工具。http://technet.microsoft.com/zh-cn/sysinternals/dd535533