【发布时间】:2011-05-09 17:12:12
【问题描述】:
我的应用程序将某些工作交给工作机构,以在线程池线程中执行,如下所示
void Execute ProcessWork
{
int nRes = 0;
CFireProcessMessageWork *pProcessMessageWork = new CFireProcessMessageWork();
// Incorrect use of stack variable
pProcessMessageWork->m_pStatus = &nRes;
// Worker Agency
m_pMessageWorkerAgency->SubmitWork(pProcessMessageWork);
}
CFireProcessMessageWork 的定义如下。下面给出的类的 DoWork 方法将在工作线程中执行。由于变量 nRes 的使用方式不当,我的应用程序偶尔会崩溃。我花了将近一周的时间来确定问题的原因。我尝试使用完整选项和堆栈帧 (/RTC) 的页面堆来检测问题。但应用程序在与问题无关的位置崩溃。
微软是否提供任何工具来检测此类问题?
class CFireProcessMessageWork
{
public:
int *m_pStatus;
public:
CFireProcessMessageWork()
{
m_pStatus = NULL;
}
int DoWork()
{
// Using Address of nRes
*mpStatus = 0;
// Do Some Work and Pass mpStatus to fill the error code
HRESULT hRes = pGEMMessageEvents->ProcessMessage(varData, m_nMsgCount, m_newTkt,m_idxFunc,&m_nRetVal);
return *mpStatus
}
}
【问题讨论】:
-
我不知道有什么工具,但你绝对应该有一个流程——它叫做code-review!跨度>
-
为什么首先要存储地址?
标签: c++ memory-management windbg