我遇到了一个非常奇怪的问题.
代码如下:
::boost::shared_ptrpInfo=CQUserViewDataManager::GetInstance()->GetImageFileInfo(nIndex); Image* pImage=pInfo->m_pThumbnail; if(pImage==NULL) pImage=m_pStretchedDefaultThumbImage; else { // int sourceWidth = pInfo->GetWidth(); int sourceHeight = pInfo->GetHeight(); int destX = 0, destY = 0; float nPercent = 0; float nPercentW = ((float)GetThumbImageWidth()/(float)sourceWidth);; float nPercentH = ((float)GetThumbImageHeight()/(float)sourceHeight); if(nPercentH < nPercentW) { nPercent = nPercentH; destX = (int)((GetThumbImageWidth() - (sourceWidth * nPercent))/2); } else { nPercent = nPercentW; destY = (int)((GetThumbImageHeight() - (sourceHeight * nPercent))/2); } int destWidth = (int)(sourceWidth * nPercent); int destHeight = (int)(sourceHeight * nPercent); rcShowImage=CRect(rc.left+destX, rc.top+destY,rc.left+destX+destWidth,rc.top+destY+destHeight); } ASSERT(pImage != NULL); // passed assertion... graphics.DrawImage(pImage,rcShowImage.left,rcShowImage.top, rcShowImage.Width(),rcShowImage.Height()); // problem happened here.
我收到以下例外:
First-chance exception at 0x004095b0 in ec.exe: 0xC0000005: Access violation reading location 0xfeeefef2. Unhandled exception at 0x004095b0 in ec.exe: 0xC0000005: Access violation reading location 0xfeeefef2.
我已经检查了pImage
,我确定什么时候graphics.DrawImage
被调用,但事实并非如此NULL
.
为什么会出现这样的问题?
什么是0xfeeefef2
?
bk1e.. 11
0xfeeefeee
是一个填充模式,Windows堆的调试版本(不是C运行时堆)用于未初始化的内存.0xfeeefef2
是0xfeeefeee+4
.听起来你正在取消引用一个未初始化的指针,该指针位于从堆分配的内存块中(或从中复制).
在调试器中启动程序时,调试堆会自动启用,而不是使用调试器附加到已经运行的程序.
由Mario Hewardt和Daniel Pravat编写的高级Windows调试书有一些关于Windows堆的正确信息,事实证明,关于堆的章节在网站上作为样本章节.
0xfeeefeee
是一个填充模式,Windows堆的调试版本(不是C运行时堆)用于未初始化的内存.0xfeeefef2
是0xfeeefeee+4
.听起来你正在取消引用一个未初始化的指针,该指针位于从堆分配的内存块中(或从中复制).
在调试器中启动程序时,调试堆会自动启用,而不是使用调试器附加到已经运行的程序.
由Mario Hewardt和Daniel Pravat编写的高级Windows调试书有一些关于Windows堆的正确信息,事实证明,关于堆的章节在网站上作为样本章节.