报错内容:
COMMConsoleServer.exe 中的 0x1004a498 (COMMUtil.dll) 处未处理的异常: 0xC0000005: 读取位置 0xfeeefeee 时发生访问冲突
错误分析:
该错误一般是由于访问不该访问的内存导致的。在堆内存空间的释放过程中,函数HeapFree会用0xfeeefeee去对
内存做标记,表示该内存是空闲的,也就是说,通过该指针访问到的内存,其实是不属于你的。就报错了。
问题来源:
在如下代码中,
int _tmain(int argc, _TCHAR* argv[]) { _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG | _CRTDBG_LEAK_CHECK_DF); _CrtSetBreakAlloc(150); //启动服务线程,监听并建立连接 pSrvThread = new ServerThread(); pSrvThread->start(); //::Sleep(1000); pSrvThread->stop(); delete pSrvThread; _CrtDumpMemoryLeaks(); return 0; }
有时会出现上述问题,但是把Sleep(1000)语句将上去,就不会出现这样的问题。于是在start函数中添加了断点,进行跟踪。发现了问题。
start函数如下:
void Thread::start()
{
m_hThread = ::CreateThread(NULL, 0, _thd_start, this, 0, &m_threadId); //线程创建后立即运行
}
extern unsigned long _stdcall _thd_start(void* param) //线程函数的定义有固定的规则 { return (long)((Thread*)param)->run(); }