BadPtr после нескольких итераций - PullRequest
0 голосов
/ 25 октября 2010

C ++.Это может быть больше вопрос отладки в Visual Studio и работы с памятью.

У меня есть программа, которая анализирует список файлов, и путь к текущему файлу представляет собой объединение строк: объект CString с именем 'folder' и само имя файла (тоже CString).

Но послеНа 144-й итерации (я уверен, что число неважно) папка внезапно превращается в BadPtr, и приложение вылетает с нарушением прав доступа.Чтобы проверить, я создал объект CFileFind с тем же каталогом, и вместо конкатенации с папкой я конкатенирую с finder.GetRoot ().Та же самая история, 144-я итерация и сбой.

Вопрос в том, как я могу защитить память этой переменной (это нормально до 144-й итерации) или отследить функцию, которая фактически пишет в этом месте, или что-то еще для отладки этогопроблема.В течение цикла переменная папки вообще не изменяется.На самом деле он находится в закрытой секции некоторого класса, и все функции, появляющиеся в цикле, не имеют доступа к этой закрытой секции.

Код выглядит следующим образом (могут быть некоторые опечатки, потому что я вырезал из него некоторые неважные вещи):

typedef map<CString, list< CRect > > metadata;
...
metadata::iterator it=mt.begin();
list< CRect >::iterator it_l;
float i=0;

while(it!=mt.end()){
        if(cur.Load(folder+"\\"+(*it).first+".jpg")){
            it_l=(*it).second.begin();
            i+=1.0;
            while(it_l!=(*it).second.end()){
                cur.buildVector(*it_l);
                cur.printVector(mf,',');
                mf<<",1"<<"\n";
                it_l++;
            }
        }
        it++;
    }

buildVector собирает объекты в объекте CRect текущего изображения, cur.Load загружаетизображение само по себе, printVector печатает вектор в ofstream с именем mf.я считаю итерации.

ОБНОВЛЕНИЕ : Я проверил свой код, прокомментировал все строки, кроме cur.Load (...), и все еще имел сбой, но на 584-й итерации.Похоже, проблема перезаписи памяти.Я просмотрел все функции в Load:

    bool Image::Load(CString& path){
     if(!src.IsNull()){ 
        src.Destroy();
     }
     src.Load(path);    
     width=src.GetWidth();
     height=src.GetHeight();
     fillBrightnessMatrix();
     fillGradientMatrices();
     return true;
    }

и обнаружил, что комментирование fillBrightnessMatrix () заставляет итерации проходить через конец списка без каких-либо ошибок.Эта функция является единственной, которая работает с памятью, и здесь идет ее код:

 void Image::fillBrightnessMatrix(){
    const int nPitch = src.GetPitch();

    const unsigned int nWidth = src.GetWidth();
    const unsigned int nHeight = src.GetHeight();
    BYTE * pxPixel = reinterpret_cast<BYTE*>(src.GetBits());


    for(int nY = 0; nY < nHeight; ++nY)
    { 
        for(int nX = 0; nX < nWidth; ++nX)
        {
            pxPixel += 3;
            bright[nX][nY]=((*pxPixel+*(pxPixel+1)+*(pxPixel+2))/3.0)/255.0;
        };

        if(nPitch >= 0)
            pxPixel += nPitch - (nWidth*3);
        else
            pxPixel -= ((nWidth*3) + (nPitch*(-1)));
    };
}

bright выделяется в конструкторе, его double [500] [500].На самом деле, я не вижу никаких утечек памяти в этом коде, что я делаю неправильно?

Теперь отладчик указывает на эту строку:

bright[nX][nY]=((*pxPixel+*(pxPixel+1)+*(pxPixel+2))/3.0)/255.0;

, говоря, что pxPixel является BadPtr>.ничего не понимаю.

1 Ответ

1 голос
/ 25 октября 2010

Я не смотрел на ваш код, но пахнет, как будто кто-то пишет за пределами своих данных.Чтобы поймать что-то вроде этого:

  • Пусть ваш цикл дойдет до 143-й итерации.(Используйте условную точку останова для прерывания в 143-й раз.) Проверьте вашу папку, чтобы убедиться, что она действительно в порядке.
  • Установить точку останова данных по адресу их данных.(Я не знаю CString, поэтому не могу вам помочь.)
  • Один шаг по коду.
  • Когда достигает точки останова данных, посмотрите на стек, чтобы узнать, что происходит.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...