Wycieki pamięci w QT - jak to zlokalizować

Odpowiedz Nowy wątek
2011-08-01 09:08
taki eden
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ć?

Pozostało 580 znaków

2011-08-01 10:43
0

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

Pozostało 580 znaków

2011-08-01 11:45
taki jeden
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

Pozostało 580 znaków

2011-08-01 12:25
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.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 2x, ostatnio: MarekR22, 2011-08-01 12:28

Pozostało 580 znaków

2011-08-01 13:04
takijeden
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ć?

Pozostało 580 znaków

2011-08-01 13:25
taki jeden
0

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

Pozostało 580 znaków

2011-08-01 13:26
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ą.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
Obiekty alokowane na stosie + watki?! Chrystusie nazarenski!!!... - EgonOlsen 2011-08-01 14:10
bez przesady, poczytaj jak działa QPixmap (http://doc.qt.nokia.com/latest/qpixmap.html#details), stosowane jest implicit data sharing (http://doc.qt.nokia.com/latest/implicit-sharing.html#implicit-data-sharing) i copy-on-write, wszytko jest thread safe - MarekR22 2011-08-01 14:25

Pozostało 580 znaków

2011-08-01 18:10
takijeden
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ć?

Pozostało 580 znaków

2011-08-01 18:10
takijeden
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ć?

Pozostało 580 znaków

2011-08-02 09:56
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ć.

Pozostało 580 znaków

2011-08-02 10:04
taki jeden
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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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