Witam,
Mam następujący problem, stworzyłem kolejkę własnej implementacji, w której przechowuje wartości liczbowe. Przykładowo mam 2 wrzucam to do kolejki, wyświetlam - ok jest dwójka, następnie dostaje jakiś inny element, np. 5, wrzucam do kolejki, wyświetlam a tu zonk, zamiast wcześniej wspomnianej dwójki jest jakaś liczba z kosmosu typu 65000. Tutaj pojawia się moje pytanie, czy jest jakiś sposób aby zabezpieczyć elementy w kolejce przed niepożądaną zmianą wartości danych?
Moja szklana kula podpowiada, że masz błąd w osiemdziesiątej siódmej linijce pliku six.c
.
@Patryk27: Faktycznie, ktoś mi podmienił średnik na grecki znak zapytania. To wiele wyjasna.
http://pastebin.com/XetPGTpr tutaj jest implementacja kolejki z której korzystam.
1.Zmień nazwę element
na value
(wraz z odpowiadającymi akcesorami).
2.Nie wykorzystuj yoda conditions
- zwyczajowo porównuje się zmiennik do niezmiennika (czyli nie 0 == cośtam
, a cośtam == 0
).
3.Zapoznaj się z nullptr
zamiast 0
.
Tak na pobieżną analizę, kod wydaje się poprawny (w rozumieniu: powinien działać poprawnie). Debugger coś podpowiada?
Edit: http://ideone.com/gQOU8e - musisz mieć bug w innym miejscu.
Prześledziłem wartości jakie przybierają zmienne i wszystko było ok z wyjątkiem tego właśnie miejsca. Wydaje mi się, że to musi być ta kolejka, bo kiedy podstawiam za nią tą z STL'a to wszystko działa jak należy.
Wrzuć cały kod reprezentujący problem.
Nie bardzo wiem co się stało, ale już wszystko zaczęło działać. Jeśli mógłbym to miałbym pytanie co do tej kolejki, mianowicie chodzi o metode dequeue() zwraca ona wskaźnik na węzeł usuwany z kolejki, jednak nie jest on chyba całkowicie usuwany z pamięci? Jeśli tak to co należałoby zrobić aby go usunąć i zwolnić trochę miejsca na inne rzeczy?
Nie bardzo wiem co się stało, ale już wszystko zaczęło działać.
Jeśli nagle zaczęło wszystko działać, najprawdopodobniej nadal masz bug w kodzie. Use after free
, błędne indeksowanie czy cokolwiek - po prostu póki co masz warunki, które sprzyjają jego ukryciu. Nie zdziw się, gdy aplikacja wykrzaczy się w losowym miejscu.
Jeśli tak to co należałoby zrobić aby go usunąć i zwolnić trochę miejsca na inne rzeczy?
Najlepiej byłoby nie wykorzystywać gołych wskaźników (antyidiom w C++, poczytaj sobie).