.Доступ к месту чтения с нарушением - PullRequest
0 голосов
/ 06 ноября 2008

Я встретил действительно странную проблему.

Код выглядит следующим образом:

::boost::shared_ptr<CQImageFileInfo> pInfo=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?

Ответы [ 3 ]

11 голосов
/ 06 ноября 2008

0xfeeefeee - это шаблон заполнения, который используется отладочной версией кучи Windows (не кучи времени выполнения C) для неинициализированной памяти. 0xfeeefef2 - это 0xfeeefeee+4. Похоже, вы разыменовываете неинициализированный указатель, расположенный в (или скопированный из) блоке памяти, выделенном из кучи.

Куча отладки автоматически включается при запуске вашей программы в отладчике, а не подключается к уже запущенной программе с помощью отладчика.

Книга Расширенная отладка Windows от Марио Хьюардта и Даниэля Правата содержит некоторую приличную информацию о куче Windows, и оказывается, что глава о кучах веб-сайт в качестве образца главы .

2 голосов
/ 06 ноября 2008

Когда вы делаете

pImage=m_pStretchedDefaultThumbImage;

Есть ли вероятность, что m_pStretchedDefaultThumbImage неинициализирован?

0 голосов
/ 06 ноября 2008

Что произойдет, если pImage == NULL на третьей строке, которую вы вставили? В этом случае rcShowImage не присваивается значение.

...