未处理的异常:0xC0000005: 读取位置 0xfeeefeee 时访问冲突

报错内容:

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();
}

 

错误分析:

如果没有sleep函数,根据DEBUG的过程,会出现这样的情况,我delete pSrvThread之后,才会进入线程启动函数start。 出问题了,start函数中的参数传入的是this指针,但是在delete之后this指针指向的空间已经释放,所以this指针是 无效的,再通过它去调用对象的run函数就报错了。

你可能感兴趣的:(C/C++)