Wycieki pamięci w QT - jak to zlokalizować

0

napisałem sobie aplikację w QT
działa ale jej używanie powoduje zastraszający przyrost zużywanej pamięci

używam watków, QPixmap. QPixmapCache itd

i chciałbym zobaczyć co i gdzie cieknie - bo w kreatorze komunikaty mam takie

Rozpoczęto debugowanie
Zakończono debugowanie

ewentualnie takie

Rozpoczęto debugowanie
QPaintDevice: Cannot destroy paint device that is being painted
Zakończono debugowanie

menu
Debugowanie > uruchom analizator - jest wyszarzone

a pomoc z Qt mi mówi że - Note: Memcheck is supported on Linux and Mac OS.

co z tym zrobić?

0

Przerzucić się na jakiś *nix zainstalować valgrinda lub co tam Qt Creator potrzebuje i przetestować.

0
winerfresh napisał(a)

Przerzucić się na jakiś *nix zainstalować valgrinda lub co tam Qt Creator potrzebuje i przetestować.

a jest jakiś prostszy sposób, niż wywracanie wszystkiego do góry nogami :)

co do przyrostu pamięci
zrobiłem sobie mapkę na QT taką z Googla - jest ok - wszystko się przesuwa zumuje itp itd

ale gdy wczytuje obrazki z sieci to mi zużycie ramu rośnie w tempie zastraszającym - po wczytaniu początkowego zestawu kafelków mam około 40 MB
po doczytaniu rzędu lub kolumny mam już o 5 - 7 MB więcej

i tak sobie rośnie i rośnie aż aplikacja się zacina i po wszystkim

nie wiem czemu to rośnie w tak zastraszającym tempie

obojetie czy jest to na sygnałach - slotach czy na wątku to jest przyrost o tyle samo

ma ktoś pomysł w czym może tkwic przyczyna

ps - kodu nie wklejam, bo jest tego sporo

0

Przyczyna jest taka, że w twoim kodzie jest wyciek. Dopóki nie pokarzesz kodu to nikt nie będzie w stanie powiedzieć dokładnie gdzie.
Umieść kod na jakimś serwerze i daj linka, ktoś na pewno sprawdzi (choćby na Linux).
Możesz też spróbować DUMA.

0
MarekR22 napisał(a)

Przyczyna jest taka, że w twoim kodzie jest wyciek. Dopóki nie pokarzesz kodu to nikt nie będzie w stanie powiedzieć dokładnie gdzie.
Umieść kod na jakimś serwerze i daj linka, ktoś na pewno sprawdzi (choćby na Linux).
Możesz też spróbować DUMA.

znalazłem co mi przeszkadza

mam klasę-magazyn kafelków, w niej jest QPixmapCache - oraz metoda która wypełnia cache dla pixmapów

Insert(x, y, zoom, *pixmap) - czyli pozycja x, y kafelka i jego zoom, oraz wskaźnik do pobranej z sieci grafiki kafelka

jest ona wywoływana w 3 miejscach

no i teraz jak dodaję

QPixmapCache::insert(klucz, *pixmap)

jest OK

ale wiadomo wskaźnik zostaje no i przez to jest to wszystko

ma ktoś pomysł jak temu zaradzić?

0

znalazłem sobie wyjście jakieś
mianowicie składować kafelki na dysku i po kłopocie

0

nie ma sensu alokować QPixmap na stercie, QPixmap jest napisana w taki sposób, że przekazywanie jej przez wartość w zasadzie nic nie kosztuje, a rozwiązuje to problem zarządzania pamięcią.

0
MarekR22 napisał(a)

nie ma sensu alokować QPixmap na stercie, QPixmap jest napisana w taki sposób, że przekazywanie jej przez wartość w zasadzie nic nie kosztuje, a rozwiązuje to problem zarządzania pamięcią.

i wlasnie o QPixmap chodzi

problem polega na tym, że gdy np dodaję sobie kolejne kafelki jako do QPixmap do np Listy czy Mapy to ich rozmiar jest o jakieś 15x większy niż PNG na dysku

czyli np kafelki dla mojego monitora na dsyku zajmują coś ponad 2MB a program rośnie do ponad 40MB

jak temu zaradzić?

0
MarekR22 napisał(a)

nie ma sensu alokować QPixmap na stercie, QPixmap jest napisana w taki sposób, że przekazywanie jej przez wartość w zasadzie nic nie kosztuje, a rozwiązuje to problem zarządzania pamięcią.

i wlasnie o QPixmap chodzi

problem polega na tym, że gdy np dodaję sobie kolejne kafelki jako do QPixmap do np Listy czy Mapy to ich rozmiar jest o jakieś 15x większy niż PNG na dysku

czyli np kafelki dla mojego monitora na dsyku zajmują coś ponad 2MB a program rośnie do ponad 40MB

jak temu zaradzić?

0

Bo PNG masz na dysku spakowany, a w pamięci jest trzymany rozpakowany jako bitmapa. Nie znam Qt, ale możliwe, że jeśli np. te kafelki używają ograniczonego zestawu kolorów, to może da się pixmapy ustawić tak, by nie zżerały 4 bajtów / piksel, tylko mniej. W Javie tak można, to w Qt też się powinno dać.

0
Krolik napisał(a)

Bo PNG masz na dysku spakowany, a w pamięci jest trzymany rozpakowany jako bitmapa. Nie znam Qt, ale możliwe, że jeśli np. te kafelki używają ograniczonego zestawu kolorów, to może da się pixmapy ustawić tak, by nie zżerały 4 bajtów / piksel, tylko mniej. W Javie tak można, to w Qt też się powinno dać.

Dziękuje Wam wszystkim za podpowiedzi
posiedziałem pogrzebałem i się udało - śmiga jak przedtem, a nie przekracza 60 MB ramu

wszystkiemu winne były wskaźniki - jak że tak powiem zrozumiałem co i jak i gdzie głupot e robię to od razu poszło dobrze - ale to trzeba było czasu

1 użytkowników online, w tym zalogowanych: 0, gości: 1