Wyciek pamięci - pomocy

Odpowiedz Nowy wątek
2011-09-14 18:35
gosc
0

Witam. Mam następujący problem. Mój program ma przyrostowe zużycie, czyli na pewno jest wyciek pamięci. Na 100% nie jest spowodowany moją alokacją i dealokacją. Sprawdzałem kod linijka po linijce, niczego nie przeoczyłem. Moje pytanie brzmi: jakie mogą być inne źródła wycieków? Piszę w C++Builder6. Używałem już CodeGuard, ale on sprawdza tylko czy zgadza się ilość new z ilością delete, to za mało.

Pozostało 580 znaków

2011-09-14 18:52
0

Nie koniecznie chodzi o kasowanie obiektów. Swego czasu nawet w mądrości swojej spłodziłem pięknego memleaka w JavaScripcie :D W grę wchodzi buffer overflow, handle leak...


Women were the reason I became a monk - and, ah, the reason I switched back...
edytowany 1x, ostatnio: Demonical Monk, 2011-09-14 18:52

Pozostało 580 znaków

2011-09-14 18:57
5

Sprawdz w linii 116 mam przeczucie, że to o ten fragment chodzi


Gdy się nie wie, co się robi, to dzieją się takie rzeczy, że się nie wie, co się dzieje ;-)

Pozostało 580 znaków

2011-09-14 18:59
gosc
0

jak się nie wie o co chodzi to się nie odpowiada na posty

sory, ale to było do twojego podpisu, myślałem, że to twoja odpowiedz na post. Nie zamieszczę fragmentu kodu. Proszę o odpowiedź na pytanie: jakie mogą być jeszcze przyczyny wycieków?

Pozostało 580 znaków

2011-09-14 19:04
0

Błędnie niszczone kontenery ze wskaźnikami?

EDIT

Możesz spróbować jeszcze statycznej analizy kodu. Jest np. taki program: http://cppcheck.sourceforge.net/
Spróbuj i daj znać czy coś pomogło a jak nie to też daj znać. Jestem ciekaw na ile przydatne jest takie narzędzie w projekcie.


Jeśli uważasz mój post za wartościowy - daj punkt.
Mój post pomógł Ci rozwiązać problem - zaznacz go.

Pozdrawiam
edytowany 1x, ostatnio: Hostel, 2011-09-14 19:06

Pozostało 580 znaków

2011-09-14 19:07
Gabriel
0

Niepokalane poczęcie.

Pozostało 580 znaków

2011-09-14 19:34
0

Proponuję wszędzie gdzie używasz operatorów new i delete zastąpić to po prostu auto_ptr z biblioteki standardowej <memory>.
Nie będziesz miał wtedy problemów z wyciekami.


Gdy się nie wie, co się robi, to dzieją się takie rzeczy, że się nie wie, co się dzieje ;-)
edytowany 2x, ostatnio: MJay, 2011-09-14 19:35
Wtedy będzie z kolei dziwił się gdy zaczną wyskakiwać komunikaty o naruszeniu ochrony pamięci :| - Hostel 2011-09-14 19:36
Ale wtedy chociaż wiadomo gdzie. Zastanawia mnie, czy autor wątku jak idzie do lekarza, to mówi, że go boli, ale nie powie gdzie. - Zjarek 2011-09-14 19:39
Przecież to zwyczajna klasa, która używa new i delete z tym, że po wyjściu z zakresu kiedy niszczony jest obiekt klasy auto_ptr uruchamia się destruktor który czyści zaalokowaną wcześniej pamięć. - MJay 2011-09-14 19:41
Fakt, teraz sobie skojarzyłem, jeżeli gdzieś poza zakresem używa w dalszym ciągu tego obiektu, to już nie będzie mógł. - MJay 2011-09-14 19:43

Pozostało 580 znaków

2011-09-14 19:39
1

Może jeszcze przyczyną być używanie złego delete, a konkretnie delete tablica_obieków; - nie zostaną wywołane destruktory wszystkich obiektów, a tylko jednego. Musi być delete [] tablica_obiektów;

Bez pokazania kodu, w którym masz ten wyciek nikt Ci nic więcej z kryształowej kuli nie wywróży.


edytowany 1x, ostatnio: byku_guzio, 2011-09-14 19:40

Pozostało 580 znaków

2011-09-14 22:27
0

Loguj w jakich funcjach wywołujesz new i w jakich delete i najlepiej jeszcze adresy jaki zwróci new i jaki przekazujesz do delete. Dla ułatwienie możesz przeciążyć new i delete i wpisywać do loga stack trace'y z tych funkcji.
Poza tym są narzędzia do detekcji memory leaków, Na Linuksie jest Valgrind, na Windowsie możesz użyć Boehm GC z włączoną opcją detekcji leaków.

Pozostało 580 znaków

2011-09-16 13:49
0

Jakość pytania wpływa na jakość odpowiedzi, więc nie spodziewaj się cudów.
Całkiem możliwe, że twój algorytm jest zły i ma po prostu dużą złożoność pamięciową (nie oznacza to wycieku pamięci).
Poza tym co rozumiesz przez: "Mój program ma przyrostowe zużycie, czyli na pewno jest wyciek pamięci."? Po godzinie działania zajmuje ci 1.5 GB? Czy może przeszkadza ci to, że proces w pamięci zajmuje 120 MB i stwierdzasz to za pomocą task menager'a?


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.

Pozostało 580 znaków

2011-09-16 17:03
0

A czemu po prostu nie odpalisz valgrinda z jakimś leak-check=full i po prostu nie odczytasz sobie skąd się biorą wyciecki?


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
valgrind - fajny program lecz założyciel wątku zaznaczył że używa "super" środowiska C++Builder6. - Hostel 2011-09-16 17:05
To ze akurat w tym pisze to nie koniecznie oznacza że nie da sie tego skompilować w gcc ;) - Shalom 2011-09-16 17:27
Na 99% nie można - mając 1% szansy próbowałbyś portować program? Mało opłacalne, chyba że robi to się dla siebie, w wolnej chwili i ma się ochotę na masochizm. VCL pod linuksem - nadal jestem zszokowany ;P No i nie bardzo gcc a g++ ;) - Hostel 2011-09-16 19:11
gcc = GNU Compiler Collection i zawiera w sobie kompilatory różnych języków, w tym g++ - Shalom 2011-09-18 22:23
Moja wpadka z tym gcc ;) Zasugerowałem się poleceniem nie myśląc o rozwinięciu trzech liter. - Hostel 2011-09-19 01:10

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