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>.ничего не понимаю.