[C++] Wycieki pamięci?

Mam program, który przetwarza obrazy. Bierze obraz, ma na nim wykonać operacje, a potem wyrzucić wynik. Dla każdego obrazu tworzony jest osobny obiekt klasy, która przetrzymuje wszystkie dane o obrazie, inne potrzebne dane do przetwarzania i wyniki.

Gdy program przetwarza np. 30 obrazów pod rząd, w pewnym momencie zaczyna się kończyć pamięć w kompie i program się wywala. Zastanawia mnie czy to wyciek pamięci czy jednak kod może być dobrze napisany a to normalne, że program się wywala gdy zabraknie mu pamięci?

Witam,

podaj informacje odnośnie wymiarów obrazów i palety kolorów.

Pozdrawiam

Zależy ile zajmują te obrazy, ile masz pamięci w komputerze i jak wczytujesz te obrazy - wszystkie naraz czy po jednym? Możliwe są oba scenariusze.

Wymiary i palety kolorów są różne. Możesz wczytać dowolny obraz w odcieniach szarości/kolorowy w dowolnym rozmiarze.

Zależy od obrazu. Klasa przechowująca obraz zajmuje dużo więcej pamięci niż sam obraz bo przechowuje masę innych danych - dużo rzeczy jest liczonych dla każdego obrazu.

Obrazy wczytuję po jednym. Na początku wczytywany jest pierwszy, na nim są robione odpowiednie obliczenia, ustawianie parametrów dla których wynik zadowala użytkownika. Potem przetwarzane są pojedynczo wszystkie kolejne na podstawie parametrów ustawionych na pierwszym obrazie. Dla każdego tworzony jest nowy obiekt (obserwując menadżera zasobów, każdy ma ok. 200 MB). I gdy zajętość pamięci dochodzi do maksimum (4 GB) wywala się.

Problem nie występuje gdy odpalałem go na maszynie która ma bodajże 16 GB RAMu.

Witam

zwalniasz obiekt po jego przetworzeniu i zapisaniu wyniku ??

Pozd

Nie, ponieważ wyniki nie są zapisywane tylko pamiętane w obiekcie.

Może po prostu zaprezentuj ten tajemniczy kod, który wymaga tak absurdalnie dużo pamięci operacyjnej :wink:

Nie mogę - zobowiązałem się do nie udostępniania kodu. Zresztą ma kilkanaście tysięcy linii.

I nie wymaga absurdalnie dużo pamięci, po prostu jest rozbudowany.

Głównie chodzi mi o kwestię czy wywalanie się programu w takiej sytuacji musi być związane z wyciekiem pamięci czy po prostu jest możliwość, że w kodzie jest wszystko OK i bez maszyny z odpowiednią liczbą pamięci po prostu nie będzie działał poprawnie.

To w takim razie kolego:

  • zobacz jakich typów danych używasz

  • sprawdź ile wybrany typ danych wymaga pamięci

  • zobacz jakich oraz ile struktur (w tym klas) wykorzystujących te typy danych masz w swoim programie

  • oszacuj - gdzie, kiedy oraz ile wszystkich w/w wykorzystujesz i przełóż to na zapotrzebowanie pamięci

Jeśli byłeś w stanie napisać kilkanaście tysięcy linii kodu rozbudowanej aplikacji graficznej, nie powinieneś mieć problemów z podstawowymi operacjami: dodaj, pomnóż, podziel. Jeśli jest to dla Ciebie zbyt trudne, użyj jakiejś aplikacji “free graphical c++ memory profiler”.

Oczywiście, możliwe jest że zwyczajnie zabraknie pamięci.