Autor Wątek: Wycieki Pamięci  (Przeczytany 4037 razy)

Offline Lavi

  • Użytkownik
    • using namspace <Lavi.h>

# Luty 24, 2010, 00:46:51
Siema,

Może nie najlepszy temat ale w sumie chyba najbardziej pasujący bo chodzi o C++. Fakt, faktem o Visual C++ 2008.

Korzystając z porad z tego linku:
http://msdn.microsoft.com/en-us/library/e5ewb1h3%28VS.71%29.aspx

Spis wycieków powinien wyglądać tak:

Kod: (cpp) [Zaznacz]
Detected memory leaks!

Dumping objects ->
C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18}
normal block at 0x00780E80, 64 bytes long.
Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.

Niestety wygląda tak:

Kod: (cpp) [Zaznacz]
Detected memory leaks!

Dumping objects ->
{18} normal block at 0x00780E80, 64 bytes long.
Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.

I nie jest to zbytnio użyteczne ;/

Może ktoś z was bawił się czymś takim i miał podobny problem.
Ew. jakiś inny sposób na znalezienie wycieków, program (oczywiście darmowy).

Z poważaniem
Lavi

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline gunstar

  • Użytkownik

# Luty 24, 2010, 01:02:01
Spróbuj:
Kod: (c++) [Zaznacz]
#if defined(DEBUG) || defined(_DEBUG)
    #define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif

;)

Offline Lavi

  • Użytkownik
    • using namspace <Lavi.h>

# Luty 24, 2010, 01:13:09
Niestety sypie masą błędów ;/

Visual C++ niestety to nie to samo co zwykły C++ ;/

Ehh :/

Offline Kos

  • Użytkownik
    • kos.gd

# Luty 24, 2010, 01:23:06
Jeśli Twój kod się kompiluje pod g++, to odpal jakiegoś linuksa i sprawdź programem valgrind - bardzo przydatna rzecz.

e-> Możesz też przejrzeć ten temat (i zawarte w nim linki do pokrewnych).
http://devpytania.pl/questions/224/darmowe-narzedzia-dla-c
« Ostatnia zmiana: Luty 24, 2010, 01:24:53 wysłana przez Kos »

Offline novo

  • Użytkownik
    • my devblog

# Luty 24, 2010, 01:46:13
Zagooglaj VisualLeakDetector. Uzywalem tego jak jeszcze siedzialem na windzie i VS. Robisz sobie oddzielny target z ta libka podpieta i masz w outputcie VS liste wyciekow.

Offline Aithne

  • Użytkownik

# Luty 24, 2010, 02:05:06
Visual C++ niestety to nie to samo co zwykły C++ ;/
Faktycznie. Visual C++ to IDE, C++ to język programowania.

Offline Khaine

  • Użytkownik

# Luty 24, 2010, 03:58:48
jeśli to Ci nie działa
#if defined(DEBUG) || defined(_DEBUG)
    #define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif
to zrób
#define moj_new new(_NORMAL_BLOCK, __FILE__, __LINE__)
i po kłopocie ;)

Offline yarpen

  • Użytkownik

# Luty 24, 2010, 10:43:14
Spokojnie, nie ma co zaprzegac kombajnow od razu. Wszystkie informacje ktorych potrzebujesz masz podane na tacy. Nie zwalniasz allokacji #18. Zeby miec informacje o dokladniejszym miejscu wstaw #define CRTDBG_MAP_ALLOC _przed_ wszystkimi naglowkami. Da sie tez ustawic conditional breakpoint na allokacji o dowolnym numerze, ale to juz wymaga pewnych trickow.
 

Offline Lavi

  • Użytkownik
    • using namspace <Lavi.h>

# Luty 24, 2010, 15:04:24
Problem w tym że tak mam tyle że nadal nie wyświetla nadal linii w której jest błąd ;/ Mimo że jest zrobione tak jak piszą w artykule.

Offline yarpen

  • Użytkownik

# Luty 24, 2010, 15:17:01
- uzywasz malloc czy new?
- pamietaj o _ przed _CRTDBG_MAP_ALLOC

Offline spax

  • Użytkownik

# Luty 24, 2010, 15:26:57
[...] Da sie tez ustawic conditional breakpoint na allokacji o dowolnym numerze, ale to juz wymaga pewnych trickow.

_CrtSetBreakAlloc(dowolny_numer);
Problematyczne może być gdy numer alokacji jest zależny od czasu. yarpen, znasz na to jakąś rade? :)

Offline Lavi

  • Użytkownik
    • using namspace <Lavi.h>

# Luty 24, 2010, 15:48:42
jeśli to Ci nie działa
#if defined(DEBUG) || defined(_DEBUG)
    #define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif
to zrób
#define moj_new new(_NORMAL_BLOCK, __FILE__, __LINE__)
i po kłopocie ;)

I niestety nie działa. Kompilator VC++ nie przełknie tego ;/

- uzywasz malloc czy new?
- pamietaj o _ przed _CRTDBG_MAP_ALLOC

- Używam new
- I pamiętam o tym :)

Na stronie MSDN jedne z pracowników napisał mi żebym zdefiniował to w PREPROCESORZE projektu wtedy będzie to w każdym pliku widziane.

Najśmieszniejsze jest to że używając VirtualLeakDetector'a pisze że nie mam wycieków.
DirectX pisze jeszcze jakieś inne niezwolnione ramki mimo że żaden z obiektów nie zwraca licznika referencji większego niż 0.
A ten cały "CRTDBG" zwraca mi wszystkie że wszystkie strigni w jednym pliku mają po kilka bajtów wycieku ;/

Przy dużym projekcie ciężko jest potem to ogarnąć.

Mam takie pytanie czy jeśli korzystam z PRECOMPILED HEADER to ma to jakieś znaczenie (pomijam VLD gdzie ponoć trzeba to deklarować wszędzie za tym includem)

Offline yarpen

  • Użytkownik

# Luty 24, 2010, 16:06:23
[...] Da sie tez ustawic conditional breakpoint na allokacji o dowolnym numerze, ale to juz wymaga pewnych trickow.

_CrtSetBreakAlloc(dowolny_numer);
Problematyczne może być gdy numer alokacji jest zależny od czasu. yarpen, znasz na to jakąś rade? :)
Nie znam. A CrtSetBreakAlloc to upierdliwa metoda, bo trzeba przekompilowywac projekt. Lepiej wyciagnac referencje do licznika na zewnatrz i ustawic na niej conditional breakpoint.

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Luty 24, 2010, 20:02:06
W ostateczności można też próbować zakomentować różne większe i mniejsze części kodu swojego programu za każdym razem sprawdzając, czy jest wyciek czy go nie ma. W ten sposób można w końcu dojść do miejsca, w którym następuje nieszczęsna alokacja.

Offline Dab

  • Redaktor
    • blog

# Luty 24, 2010, 20:02:31
Cytuj
Lepiej wyciagnac referencje do licznika na zewnatrz i ustawic na niej conditional breakpoint.
Jeżeli myślimy o tym samym conditional breakpoint to chyba szybciej będzie jednak przekompilować projekt ;)