Консультация № 144943
24.09.2008, 23:56
0.00 руб.
0 1 1
Здравствуйте эксперты.
Помогите пожалуйста отладить код. Не пойму почему ошибка возникает во время выполнения.
Программа должна формировать в векторе список файлов, точнее указателей на структуры с именами и размерами файлов, только имена файлов должны быть не в разброс, как это получилось бы при рекурсивном вызове, а в формате: список_файлов_папки_1, список_файлов_папки_2, .. и т.д.

Без рекурсии работает, как только рекурсивный вызов добавляю во время выполнения выскакивает ошибка. Что-то я с итераторами напутал..
Visual Studio 2005

Приложение:
#include "windows.h"
#include <vector>
#include <iostream>
using namespace std;


class prog
{
public:
void srch(string path);
struct Sfile{std::string name; unsigned int size; unsigned int addr;};
vector <Sfile*> Vfile;
};


void prog::srch(string path)
{
HANDLE hf;
WIN32_FIND_DATA fd;
vector <Sfile*>::iterator it=Vfile.end();
string pth=path.c_str();
pth+="\\*.*";
hf=FindFirstFile(pth.c_str(),&fd);
FindNextFile(hf,&fd);
while (FindNextFile(hf,&fd))
{
Sfile *st=new Sfile;
st->addr=0;
st->name=fd.cFileName;
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
st->size=-1;
path+="\";
path+=fd.cFileName;
srch(path);
}
else st->size=fd.nFileSizeLow;
Vfile.insert(it,st);

};
FindClose(hf);
};


void main(int argc, char *argv)
{
string path="C:\\aa";
prog pr;
pr.srch(path);
for (unsigned int a=0;a<pr.Vfile.size();delete pr.Vfile.at(a++));
}

Обсуждение

Неизвестный
25.09.2008, 00:31
общий
это ответ
Здравствуйте, Вячеслав Шинкаренко!

проблема в валидности итератора, вы его присваиваете при входе в процедуру и потом рекурсивно вызываете её же, и внутри происходят вставки в вектор при которых вектор переаллокируется и ранее взятые итераторы (по сути указатели в случае вектора) ссылаются уже на освобожденную память.

Но самое интересное, что он вам вообще не нужен в данном случае, удалите строчку:
vector <Sfile*>::iterator it=Vfile.end();
а строку:
Vfile.insert(it, st);
замените на
Vfile.push_back(st);

и все будет работать
Форма ответа