Page 1 of 1

Мистическая ошибка памяти

Posted: Wed Mar 25, 2009 8:34 pm
by SmileGobo
Как вы могли заметить я пишу архиватор, в учебных целях.
В обработчике события распаковки архива валиться ошибка, причем валиться она, если распаковываю в корень диска, если распаковывать в директорию то вроде все норм.
файл archivatorMain.cpp

Code: Select all

void MyFrame1::OnUnpackFiles(wxCommandEvent& event){
    if(!m_grid1->GetNumberRows()>0){
        //Запись в лог
        return;
    }

    Zip arhiv(m_grid1->GetFiles());
    //wxMessageBox(wxEmptyString);
    arhiv.Unpack(m_dirPicker1->GetPath(),*m_statusBar1);
}
Но самая главная мистика заключается в том, что если раскоменить строку wxMessageBox(wxEmptyString); то все нормально.
ЗЫ файлы распаковываются нормально.
Уверен что я где-то глупо ошибся. Но я не как не могу понять где. :evil:
архив не прилепляется больно большой =\
http://webfile.ru/3303596

Posted: Thu Mar 26, 2009 8:11 am
by borr_1
Что за Zip это твой класс? А что там внутри достопочтенное собрание должно угадать?

Posted: Thu Mar 26, 2009 8:14 am
by SmileGobo
не был уверен что стоит выкладывать весь код в сообщение, поэтому выложил архив с файлами где и класс Zip и все остальные классы есть.

Posted: Thu Mar 26, 2009 8:40 am
by borr_1
Ну во первых ты бы рассказал что говорит отладчик на какой конкретно строе валиться. Не обижайся, но ради праздного любопытства твой код вряд ли кто-то станет компилировать и потом отлаживать за тебя.

Ну и второе угадаю... раз валиться на корне (видимо в винде) ты к буковке диска, наверно, забыл добавить + wxT("\\") прежде чем передать этот путь компилятору.

Posted: Thu Mar 26, 2009 8:51 am
by SmileGobo
Да вообще здорово, что хоть кто-то отвечает. Предпочитаю пользоваться отладочной печатью, и судя по ней валиться по выходу из функции, видимо что-то с потоками не так, может закрыть их не получается из-за не корректного пути.

В любом случае попробую слеш добавить в путь.

Posted: Thu Mar 26, 2009 8:59 am
by borr_1
Ты ведь прежде чем что-то с файликом делать проверяешь что он существует?
wxFile::Exists
static bool Exists(const char* filename)

Returns true if the given name specifies an existing regular file (not a directory or a link)

Posted: Thu Mar 26, 2009 9:33 am
by SmileGobo
Я использую потоки:

Code: Select all

wxString Zip::Unpack(const wxString& path,wxStatusBar& info){
    wxZipEntry *entry;
    for(int i=0;i<to_arhive.Count();i++){
        wxFileInputStream in(to_arhive[i]);
        wxZipInputStream zip(in);
        //wxMessageBox(wxString::Format("%s%d_comment.txt",path,i));
        //wxFileOutputStream(wxString::Format("%s%d_comment.txt",path,i));
        int j=zip.GetTotalEntries();

        while (j-->0){
            static unsigned char buf[1024];
            entry=zip.GetNextEntry(); //получить следующий вложенный файл
            wxString name = entry->GetName(); //Получить имя
            size_t byte_left=entry->GetSize();       //Получить размер
            zip.OpenEntry(*entry);
            wxFileOutputStream unpack_file(path+name);
            while (byte_left > 0){
                //wxMessageBox(wxString::Format("%d",byte_left));
                size_t bytes_read=min((size_t) sizeof(buf),byte_left);
                zip.Read((void*)buf,bytes_read);
                unpack_file.Write((void*)buf,bytes_read);
                //unpack_file.SeekO(0,wxFromEnd);
                //Вычесть прочитанное
                byte_left-=bytes_read;
            }
        }
    }
}

wxArrayString to_arhive; //Хранит список имен файлов.

Posted: Thu Mar 26, 2009 10:51 pm
by SmileGobo
Вобщем от части догадка о добавлении к пути файла wxT("\\") оказалась верной. Помимо был косяк в не аккуратном использовании указателей и ссылок (пошел учить матчасть ) :oops: .

Posted: Fri Mar 27, 2009 12:38 am
by T-Rex
И кстати не wxT("\\"), а wxFILE_SEP_PATH

Posted: Fri Mar 27, 2009 5:38 am
by borr_1
Ну если на то пошло то и у wxFileInputStream есть с-во IsOK чтобы проверить загрузил поток что-то или нет.