[+] C++, dziwny przypadek z STL

Potrzebujesz pomocy z C, C++, perl, python, itp.
Awatar użytkownika
godlark
Posty: 51
Rejestracja: 17 stycznia 2009, 14:33

[+] C++, dziwny przypadek z STL

Post autor: godlark »

Tworzę pewien program do nauki słówek i w trakcie jego tworzenia napotkałem jeden nierozwiązywalny dla mnie problem. W załączniku jest kod źródłowy programu. Instrukcja postępowania z programem:

Kod: Zaznacz cały

$ g++-4.4 main.cpp engine.cpp nakladka2.cpp kurs.cpp SingleWord.cpp RegisterOfErrors.cpp -lboost_regex-mt -o konkord2.e -ggdb3 -D_GLIBCXX_DEBUG
$ ./konkord2.e
Później wybieramy opcję "otwórz kurs", wpisujemy "pol_ang.txt", później wybieramy opcję 6, w podmenu opcję 9, i wpisujemy 2600 i 2700. Słowa powinny się wyświetlić, ale jak skompilujemy bez opcji -D_GLIBCXX_DEBUG program się wysypuje i tego właśnie nie rozumiem, jaki wpływ ma tryb debugowania na to, czy program się wysypie czy nie?

Drugi problem to nie wiem dlaczego jest to naruszenie ochrony pamięci, skoro funkcja Kurs::getSingleWords przekazuje vector, który ma 100 elementów(co widzimy po coutach w tej funkcji), to dlaczego po przypisaniu

Kod: Zaznacz cały

vector<SingleWord const*> sword_vector = courses[activ_course]->getSingleWords(from, ato);
występuje naruszenie ochrony pamięci po wypisaniu 64 elementu vectora sword_vector.

Kawałek z engine.cpp

Kod: Zaznacz cały

void ServiceOfTasks: :p rintWordss() const {
    ushort from = (*dialogWindow)("Podaj numer słowa, od którego zacząć pobieranie", 1)._ushort;
    ushort ato = (*dialogWindow)("Podaj numer słowa, na którym chcesz zakońćzyć pobieranie, wpisz 0 jeśli do końca", 1)._ushort;
    vector<SingleWord const*> sword_vector = courses[activ_course]->getSingleWords(from, ato);
    SingleWord const **swords = new SingleWord const*[sword_vector.size()];
    ushort *numbers = new ushort(sword_vector.size());
    vector<ushort> numbersConnections;
    for(ushort i = 0; i < sword_vector.size(); i++) {
        swords[i] = sword_vector[i];
        cout << i << "\t" << (long long)sword_vector[i] << endl;
        numbers[i] = from + i;
        for(ushort j = 0; j < swords[i]->getNumberMeanings(); j++) {
            numbersConnections.push_back(i);
            numbersConnections.push_back(j);
        }
    }
    (*printWords)("Aby przejść dalej naciśnij 'ENTER'", swords, numbers, numbersConnections, numbersConnections.size()/2, -1);
}
Jeśli ktoś mi pomoże, będę bardzo wdzięczny.
Czocher
Beginner
Posty: 140
Rejestracja: 26 maja 2007, 23:19

Post autor: Czocher »

Polecam valgrind:

Kod: Zaznacz cały

Podaj nazwę pliku do otwarcia.:                                                                                  
pol_ang.txt                                                                                                      
==3054== Mismatched free() / delete / delete []                                                                  
==3054==    at 0x4C21ACE: operator delete(void*) (vg_replace_malloc.c:346)                                       
==3054==    by 0x4205EA: Kurs::Kurs(std::string, RegisterOfErrors&, unsigned short) (kurs.cpp:693)               
==3054==    by 0x40D0A4: ServiceOfTasks: :o penCourse() (engine.cpp:608)                                           
==3054==    by 0x40BF4E: ServiceOfTasks::doAction(unsigned short) (engine.cpp:534)                               
==3054==    by 0x4157AC: Menu: :o pen() (nakladka2.cpp:192)                                                        
==3054==    by 0x406B18: main (main.cpp:70)                                                                      
==3054==  Address 0x7890a60 is 0 bytes inside a block of size 568 alloc'd                                        
==3054==    at 0x4C221A7: malloc (vg_replace_malloc.c:195)                                                       
==3054==    by 0x592075A: __fopen_internal (iofopen.c:76)                                                        
==3054==    by 0x41F967: Kurs::Kurs(std::string, RegisterOfErrors&, unsigned short) (kurs.cpp:649)               
==3054==    by 0x40D0A4: ServiceOfTasks: :o penCourse() (engine.cpp:608)                                           
==3054==    by 0x40BF4E: ServiceOfTasks::doAction(unsigned short) (engine.cpp:534)                               
==3054==    by 0x4157AC: Menu: :o pen() (nakladka2.cpp:192)                                                        
==3054==    by 0x406B18: main (main.cpp:70)                                                                      
==3054==                                                                                                         
==3054== Conditional jump or move depends on uninitialised value(s)                                              
==3054==    at 0x4077AC: ServiceOfTasks::setStateActions() (engine.cpp:34)                                       
==3054==    by 0x40D254: ServiceOfTasks: :o penCourse() (engine.cpp:619)                                           
==3054==    by 0x40BF4E: ServiceOfTasks::doAction(unsigned short) (engine.cpp:534)                               
==3054==    by 0x4157AC: Menu: :o pen() (nakladka2.cpp:192)                                                        
==3054==    by 0x406B18: main (main.cpp:70)                                                                      
==3054==                                                                                                         
==3054== Use of uninitialised value of size 8                                                                    
==3054==    at 0x40F399: std::_Bit_reference: :o perator bool() const (stl_bvector.h:78)                           
==3054==    by 0x407862: ServiceOfTasks::setStateActions() (engine.cpp:43)                                       
==3054==    by 0x40D254: ServiceOfTasks: :o penCourse() (engine.cpp:619)                                           
==3054==    by 0x40BF4E: ServiceOfTasks::doAction(unsigned short) (engine.cpp:534)                               
==3054==    by 0x4157AC: Menu: :o pen() (nakladka2.cpp:192)                                                        
==3054==    by 0x406B18: main (main.cpp:70)                                                                      
==3054==                                                                                                         
==3054== Conditional jump or move depends on uninitialised value(s)                                              
==3054==    at 0x407868: ServiceOfTasks::setStateActions() (engine.cpp:43)                                       
==3054==    by 0x40D254: ServiceOfTasks: :o penCourse() (engine.cpp:619)                                           
==3054==    by 0x40BF4E: ServiceOfTasks::doAction(unsigned short) (engine.cpp:534)                               
==3054==    by 0x4157AC: Menu: :o pen() (nakladka2.cpp:192)                                                        
==3054==    by 0x406B18: main (main.cpp:70)                                                                      
==3054==                                                                                                         
==3054== Conditional jump or move depends on uninitialised value(s)                                              
==3054==    at 0x407885: ServiceOfTasks::setStateActions() (engine.cpp:44)                                       
==3054==    by 0x40D254: ServiceOfTasks: :o penCourse() (engine.cpp:619)                                           
==3054==    by 0x40BF4E: ServiceOfTasks::doAction(unsigned short) (engine.cpp:534)                               
==3054==    by 0x4157AC: Menu: :o pen() (nakladka2.cpp:192)                                                        
==3054==    by 0x406B18: main (main.cpp:70)                                                                      
==3054==                                                                                                         
==3054== Use of uninitialised value of size 8                                                                    
==3054==    at 0x4078C5: ServiceOfTasks::setStateActions() (engine.cpp:46)                                       
==3054==    by 0x40D254: ServiceOfTasks: :o penCourse() (engine.cpp:619)                                           
==3054==    by 0x40BF4E: ServiceOfTasks::doAction(unsigned short) (engine.cpp:534)                               
==3054==    by 0x4157AC: Menu: :o pen() (nakladka2.cpp:192)                                                        
==3054==    by 0x406B18: main (main.cpp:70)                                                                      
==3054==                                                                                                         
==3054== Use of uninitialised value of size 8                                                                    
==3054==    at 0x407910: ServiceOfTasks::setStateActions() (engine.cpp:48)                                       
==3054==    by 0x40D254: ServiceOfTasks: :o penCourse() (engine.cpp:619)                                           
==3054==    by 0x40BF4E: ServiceOfTasks::doAction(unsigned short) (engine.cpp:534)                               
==3054==    by 0x4157AC: Menu: :o pen() (nakladka2.cpp:192)                                                        
==3054==    by 0x406B18: main (main.cpp:70)                                                                      
==3054==                                                                                                         
==3054== Use of uninitialised value of size 8                                                                    
==3054==    at 0x40793B: ServiceOfTasks::setStateActions() (engine.cpp:48)                                       
==3054==    by 0x40D254: ServiceOfTasks: :o penCourse() (engine.cpp:619)                                           
==3054==    by 0x40BF4E: ServiceOfTasks::doAction(unsigned short) (engine.cpp:534)                               
==3054==    by 0x4157AC: Menu: :o pen() (nakladka2.cpp:192)                                                        
==3054==    by 0x406B18: main (main.cpp:70)                                                                      
==3054==                                                                                                         
==3054== Use of uninitialised value of size 8                                                                    
==3054==    at 0x40798E: ServiceOfTasks::setStateActions() (engine.cpp:50)                                       
==3054==    by 0x40D254: ServiceOfTasks: :o penCourse() (engine.cpp:619)                                           
==3054==    by 0x40BF4E: ServiceOfTasks::doAction(unsigned short) (engine.cpp:534)                               
==3054==    by 0x4157AC: Menu: :o pen() (nakladka2.cpp:192)                                                        
==3054==    by 0x406B18: main (main.cpp:70)                                                                      
==3054==                                                                                                         
==3054== Use of uninitialised value of size 8                                                                    
==3054==    at 0x407A1D: ServiceOfTasks::setStateActions() (engine.cpp:60)                                       
==3054==    by 0x40D254: ServiceOfTasks: :o penCourse() (engine.cpp:619)                                           
==3054==    by 0x40BF4E: ServiceOfTasks::doAction(unsigned short) (engine.cpp:534)                               
==3054==    by 0x4157AC: Menu: :o pen() (nakladka2.cpp:192)                                                        
==3054==    by 0x406B18: main (main.cpp:70)                                                                      
==3054==                                                                                                         
==3054== Use of uninitialised value of size 8                                                                    
==3054==    at 0x407A4B: ServiceOfTasks::setStateActions() (engine.cpp:60)                                       
==3054==    by 0x40D254: ServiceOfTasks: :o penCourse() (engine.cpp:619)                                           
==3054==    by 0x40BF4E: ServiceOfTasks::doAction(unsigned short) (engine.cpp:534)                               
==3054==    by 0x4157AC: Menu: :o pen() (nakladka2.cpp:192)                                                        
==3054==    by 0x406B18: main (main.cpp:70)                                                                      
==3054==                                                                                                         
Aby wybrać opcję, wpisz numer, który znajduje się przy niej. Jeśli przed opcją jest '#' to opcja jest nieaktywna.

Kod: Zaznacz cały

Podaj numer słowa, od którego zacząć pobieranie:                                                                 
2600                                                                                                             
Podaj numer słowa, na którym chcesz zakońćzyć pobieranie, wpisz 0 jeśli do końca:                                
2700                                                                                                             
==3054== Use of uninitialised value of size 8                                                                    
==3054==    at 0x40DA87: ServiceOfTasks: :p rintWordss() const (engine.cpp:661)                                    
==3054==    by 0x40BF6A: ServiceOfTasks::doAction(unsigned short) (engine.cpp:540)                               
==3054==    by 0x4157AC: Menu: :o pen() (nakladka2.cpp:192)                                                        
==3054==    by 0x415800: Menu: :o pen() (nakladka2.cpp:198)                                                        
==3054==    by 0x406B18: main (main.cpp:70)                                                                      
==3054==                                                                                                         
0       fala                                                                                                     
(tu skróciłem -Czocher)                                                                     
99      kląć, przeklinać                                                                                         





0       132240672
1       132242560
==3054== Invalid write of size 2
==3054==    at 0x40DBD4: ServiceOfTasks: :p rintWordss() const (engine.cpp:668)
==3054==    by 0x40BF6A: ServiceOfTasks::doAction(unsigned short) (engine.cpp:540)
==3054==    by 0x4157AC: Menu: :o pen() (nakladka2.cpp:192)                         
==3054==    by 0x415800: Menu: :o pen() (nakladka2.cpp:198)                         
==3054==    by 0x406B18: main (main.cpp:70)                                       
==3054==  Address 0x7ea86e2 is 0 bytes after a block of size 2 alloc'd            
==3054==    at 0x4C229C7: operator new(unsigned long) (vg_replace_malloc.c:220)   
==3054==    by 0x40DAFC: ServiceOfTasks: :p rintWordss() const (engine.cpp:663)     
==3054==    by 0x40BF6A: ServiceOfTasks::doAction(unsigned short) (engine.cpp:540)
==3054==    by 0x4157AC: Menu: :o pen() (nakladka2.cpp:192)                         
==3054==    by 0x415800: Menu: :o pen() (nakladka2.cpp:198)                         
==3054==    by 0x406B18: main (main.cpp:70)                                       
==3054==                                                                          
2       132244672                                                                 
(tu skróciłem -Czocher)                                                              
99      132451648                                                                 
Aby przejść dalej naciśnij 'ENTER'                                                
Numer słowa: 2600                                                                 
132240672                                                                         
fala            wave                                                              
***                                                                               
==3054== Invalid read of size 2                                                   
==3054==    at 0x414D29: Interface: :p rintWords(std::string, SingleWord const**, unsigned short const*, std::vector<unsigned short, std::allocator<unsigned short> >, unsigned short, short) (nakladka2.cpp:47)                                                                                                                    
==3054==    by 0x40DD04: ServiceOfTasks: :p rintWordss() const (engine.cpp:674)                                                                                    
==3054==    by 0x40BF6A: ServiceOfTasks::doAction(unsigned short) (engine.cpp:540)                                                                               
==3054==    by 0x4157AC: Menu: :o pen() (nakladka2.cpp:192)                                                                                                        
==3054==    by 0x415800: Menu: :o pen() (nakladka2.cpp:198)                                                                                                        
==3054==    by 0x406B18: main (main.cpp:70)                                                                                                                      
==3054==  Address 0x7ea86e2 is 0 bytes after a block of size 2 alloc'd                                                                                           
==3054==    at 0x4C229C7: operator new(unsigned long) (vg_replace_malloc.c:220)                                                                                  
==3054==    by 0x40DAFC: ServiceOfTasks: :p rintWordss() const (engine.cpp:663)                                                                                    
==3054==    by 0x40BF6A: ServiceOfTasks::doAction(unsigned short) (engine.cpp:540)                                                                               
==3054==    by 0x4157AC: Menu: :o pen() (nakladka2.cpp:192)                                                                                                        
==3054==    by 0x415800: Menu: :o pen() (nakladka2.cpp:198)                                                                                                        
==3054==    by 0x406B18: main (main.cpp:70)
Awatar użytkownika
godlark
Posty: 51
Rejestracja: 17 stycznia 2009, 14:33

Post autor: godlark »

Wielkie dzięki Czocher :D
Przydał się i na pewno się jeszcze nie raz przyda. Podejrzewałem o wszystko vectora, a tu nie o niego chodziło. Wstyd się przyznać, gdzie był błąd, nie wiem czy z niedbalstwa czy z pośpiechu wpisałem nawiasy okrągłe, a nie kwadratowe:

Kod: Zaznacz cały

ushort *numbers = new ushort(sword_vector.size());
A tak poza tematem, mógłby ktoś napisać, co tak naprawdę robiłem jak podałem to w nawiasach okrągłych?
Awatar użytkownika
jasiekmarc
Posty: 88
Rejestracja: 27 września 2009, 20:05
Lokalizacja: Wrocław

Post autor: jasiekmarc »

Z rozmiaru vectora, który normalnie jest pewnie jakimś unsigned intem robiłeś ushort, do którego następnie definiowałeś wskaźnik, jak dla mnie. Ale nie jestem pewien.
ODPOWIEDZ