[+] C++, dziwny przypadek z STL
: 21 stycznia 2010, 21:44
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:
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 występuje naruszenie ochrony pamięci po wypisaniu 64 elementu vectora sword_vector.
Kawałek z engine.cpp
Jeśli ktoś mi pomoże, będę bardzo wdzięczny.
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
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);
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);
}